2011-02-01 61 views
0

我有一段文字(部分法文部分英文),其中有多次歐洲風格的加拿大元符號($C)。當我嘗試使用傳統或unicode字符使用正則表達式時,符號已從文本中刪除,無法與之匹配。我使用了一個懶惰的正則表達式,所以如果它沒有找到預期的符號,它仍然有效。PCRE似乎是刪除特定字符

此外,文本是在一個XML的UTF-8文檔,並從Web界面(室內製作)顯示。

+3

爲什麼不顯示您嘗試的代碼,以及一些示例文本? – ircmaxell 2011-02-01 19:37:11

+0

確定文本:門票總價:256,00 $ C稅費:221,42美元C總計:477,42美元渥太華(麥克唐納 - 卡地亞國際機場)至多倫多(YYZ)2011年8月8日1:30 PM - 2:32 PM – 2011-02-01 20:06:37

+0

正則表達式:<?php $ cost = REGEX('$ MONETARY $'); $ pattern ='/ total:((\ D | \ P {N})+?\ s?)?(?:'。$ cost。')\ s?([$ C])?/'; $ match = GetMatch($ pattern,$ input,0,1); if(isEmpty($ match)){$ match = GetMatch($ pattern,$ input,0,0); } return $ match;?> – 2011-02-01 20:07:35

回答

0

在perl中,正則表達式和代碼以ascii顯示,但是如果你想在你的文本中嵌入unicode,首先你必須有一個編輯器做unicode,其次你必須告訴Perl你的源代碼包含unicode(with一個use utf8'編譯指示)。

如果你不想這樣做,你可以使用像這樣的結構將字符串(正則表達式)中的代碼點嵌入(在Perl中)$ regex = /這是一些文本,這是:\ x {1209} a碼點unicode字符/;

它匹配字符如果數據源被解碼爲Unicode(內部化)並且包含該字符。

編輯 - 我不認爲這是對加拿大元unicode的,而「$ C」,就像有人說你要逃避$如果正則表達式進行插值。 如果你保留$ C,字符類[$ C]匹配$或C,而不是組合。也許(?:\ $ | \ $ C)會是一個更好的錨點。

0

將RegExp中的$轉義出來,美元符號在RegExp中有特殊含義。

0

問題原來是在我調用eval()之前的代碼中的一個錯誤。法國unicode中的某些東西正在與傳遞給eval的代碼搞混,所以通過不合並文本和正則表達式,它工作得很好。