2011-04-12 74 views
7

我想匹配包含某個單詞的所有字符串。像:包含unicode單詞的正則表達式

String regex = (?:\P{L}|\W|^)(ベスパ)(?:\b|$) 

然而圖案類不編譯:

java.util.regex.PatternSyntaxException: Unmatched closing ')' near index 39 
(?:\P{L}|\W|^)((?:ベス|ベス|ヘズ)(?:パ)|パ)|ハ)゚)(?:\b|$) 

我已經設置UNICODE_CASE編譯PARAM,不知道發生了什麼事錯在這裏

final Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE| Pattern.CANON_EQ); 

感謝幫幫我! :)

+1

錯誤消息*中的模式*包含兩個額外的) - 是錯誤消息還是您的帖子錯誤? – Erik 2011-04-12 21:22:47

+1

您**不得**使用'\ W','\ w','\ s','\ d','\ b','\ p {alpha}'或任何其他字符類Java正則表達式中的快捷方式,因爲Java正則表達式庫不符合[Unicode正則表達式的形式要求](http://unicode.org/reports/tr18/#Compatibility_Properties)。你可以用'[\ pL \ pM \ p {Nd} \'\'\'\'\'\'用\ [\ pL \ pM \ p {Nd} \ p {Nl} \ p { p {Nl} \ p {Pc}]'如果你不關心Enclosed_Alphanumerics。或者,您可以使用符合Unicode標準的正則表達式庫或語言。這意味着調用ICU正則表達式庫,或者調用Perl的等等。 – tchrist 2011-04-12 21:31:32

+0

你用'java -encoding UTF-8'編譯了嗎? – tchrist 2011-04-12 22:06:44

回答

0
(?:\P{L}|\W|^)((?:ベス|ベス|ヘズ)(?:パ)|パ)|ハ)゚)(?:\b|$) 
(   )((   )( ) ) ) )( ) 

的模式在錯誤消息中有兩個額外的 ')'

+0

是的,但他爲什麼會收到錯誤信息?他的原始表達中沒有不匹配的括號。 – aioobe 2011-04-12 21:30:16

+0

恩,沒有。那'\ W'將會毀了你的一天。 – tchrist 2011-04-12 21:34:27

+0

@aioobe:好問題。我們無法知道,因爲他沒有發佈初始化他的String regex變量的確切的Java代碼。 – tchrist 2011-04-12 21:37:31

0

Unicode字符在正則表達式是一個tricky business

這裏是從Pattern本文檔的段落:

Unicode支持

該類如下Unicode技術報告#18:Unicode的正則表達式的準則,實施其的支持,雖然與第二級稍微不同的具體語法。

Java源代碼中的Unicode轉義序列(如\u2014)按照Java語言規範的?3.3中的描述進行處理。這種轉義序列也可以由正則表達式解析器直接實現,以便可以在從文件或鍵盤讀取的表達式中使用Unicode轉義。 因此,字符串"\u2014""\\u2014"雖然不相等,但會編譯爲相同的模式,該模式與具有十六進制值0x2014的字符相匹配。

這樣,因爲我們知道:

  • = \u3049
  • = \u30B9
  • = \u30D1

寫你後的模式的正確方法是:

String regex = "(?:\\P{L}|\\W|^)(\\u30d9\\u30B9\\u30D1)(?:\\b|$)"; 

延伸閱讀

+0

不,我很抱歉,但是那個文檔** LIES **。相信,它的確如此.Java甚至不符合Level-1標準,更不用說Level-2的聲稱了。 JDK7人員,他們現在明白它有多糟糕,你不能使用這些東西,誠實的,所有的RL1.2a事物都是Java中的東西;它只提供RL1.2所需的11個屬性中的3個;它可以甚至沒有做RL1.1的權利,它有很多嚴重的錯誤,甚至沒有接近提供1級的支持, – tchrist 2011-04-12 22:06:16

+0

哈哈,難道你沒有什麼*更好做,比坐在等待你可以提出一個正則表達式問題,你可以投訴嗎?你可以看到幾乎每一個正則表達式問題,解釋Java正則表達式是如何破裂的。爲什麼你不保持安靜,除非你真的知道這個問題的答案? – aioobe 2011-04-12 22:08:16

+1

他*知道答案,更重要的是,他知道任何沒有提及的答案Java的正則表達式支持有多嚴重,這是錯誤的。他不僅抱怨,他多次解釋如何正確地將Unicode與Java的正則表達式類相匹配。但這是很多信息,他不能期望每一次都發布。 – 2011-04-12 22:35:05

1

從給出的錯誤信息,這看起來一點也不像顯示的字符串正則表達式,我推斷原始模式基本如下,我已經自由地重新格式化,添加符號常量,並以我們可能會檢查並更容易處理的行號。

(所有非平凡的模式應該始終寫在(?x)模式 - 儘管Java的這裏打架反對你,你還是應該這樣做)

1  (?: \P{L} | \W | ^) 
    2  (
    3   (?: \N{KATAKANA LETTER BE} \N{KATAKANA LETTER SU} 
    4   | \N{KATAKANA LETTER BE} \N{KATAKANA LETTER SU} 
    5   | \N{KATAKANA LETTER HE} \N{KATAKANA LETTER ZU} 
    6  ) 
    7   (?: \N{KATAKANA LETTER PA}) 
    8  | 
    9    \N{KATAKANA LETTER PA} 
10 ) 
11 | 
12    \N{KATAKANA LETTER HA} 
13 ) 
14  \N{COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK} 
15 ) 
16  (?: \b | $) 

第一和最後一行是錯誤的,但是它們在與Java的破壞正則表達式有關的語義方式中是錯誤的。他們不是句法上的錯誤。

現在應該很明顯,句法問題是第13行和第15行的右括號是虛假的:它們沒有相應的開括號。

雖然第一行也是最後一行,但我仍然試圖理解你在這裏真正想做什麼。爲什麼重複第3和第4行?這沒有什麼用處。我可以看到沒有理由在第7行分組。

是否允許組合標記應用於上述任何事情?

至於第一行和最後一行中的錯誤,我是否明白一個簡單的單詞邊界就是您正在尋找的所有內容?你是否真的想把那些邊界角色作爲你比賽的一部分,或者你只是試圖建立邊界?你爲什麼說一個非字母或非字?

單詞字符包括字母,至少,根據Unicode規範,即使Java確實出錯。唉,由於Java正則表達式錯誤,你只是包含了一堆字母,所以一旦我明白了你真正想要的東西,我們就必須重新編碼。

如果只有你使用的東西實際上符合UTS#18,它會工作正常,但正如我認爲你沒有(我沒有聽說過ICU),我們必須沿着線路修復它我有previously outlined

無論是單詞還是字符串的開頭都可以用於第一個字母,而對於非單詞或字符串結尾的預讀都適用於最後一個單詞。這就是\b當然是假設當面對單詞字符的時候你會這樣做,而且如果你保持清楚你的非單詞的粒子,它甚至可以用這種方法。

但是,直到我能看到更多的原始意圖,我不認爲我應該多說了。

0

UNICODE_CHARACTER_CLASS模式也可以通過嵌入標誌表達式(?u)啓用

嘗試:

(?U)(?:\P{L}|\W|^)((?:ベス|ベス|ヘズ)(?:パ)|パ)|ハ)゚)(?:\b|$) 

但首先解決您的括號內,因爲我不知道你想和什麼在中間組

相關問題