2014-02-23 47 views
0

我有一個文本文件,其中每行是下列任何組多個正則表達式與搜索算法

數字的隨機組合 - 英文字母 - 阿拉伯文字 - 標點符號

\ W它是由A-ZA-Z0-9_用於第一2組

\ p {InArabic}用於第三組

\ p {PUNCT},它由被!「#$%&「()* +, - 。/ :; < =>?@ []^_`{|}〜爲第五組p

我從here

這個信息我讀線。只有當我對這條線做些什麼的時候,如果這行包含阿拉伯字母AND(英文字母或Unicode符號)

看完這個postpost我想出了下面的表達式。顯然這是錯誤的,因爲我的輸出全錯了。 <

pattern = Pattern.compile("(?=\\p{InArabic})(?=[a-zA-Z])"); 

這裏的輸入

1 
1a 
a! 
aش 
شa 
ششa 
aشش 
شaش 
aشa 
!aش 

前三應該不匹配,但我的輸出顯示,沒有一個是匹配的。

編輯:對不起,我只是意識到,我忘了改變我的標題。但是如果你們中的任何人覺得搜索更好的性能,那麼請建議一個搜索算法。使用搜索算法,而不是正則表達式看起來很醜,但如果它表現更好,我會用它。多虧我讀了文章中,我瞭解到,我可以讓正則表達式更快,如果我把這個構造器,這樣它會被執行一次,而不是隻包括他們在我的循環從而被每次

pattern = Pattern.compile("(?=\\p{InArabic})(?=[a-zA-Z])"); 
matcher = pattern.matcher(""); 
+0

您可以構建一個正則表達式,本質上是'({英語} + * {阿拉伯語} +)|({阿拉伯語} + * {英語} +)',或者你可以建立兩種模式,一個是阿拉伯語,一個是英語,只是看看他們是否匹配。後者可能會更清晰一些。或者,你可以拋棄正則表達式,直接在同一個字符串中直接搜索阿拉伯語和英語字符。 –

+0

你用它來覆蓋兩種可能性。謝謝,但恐怕這個問題與我不完全理解如何寫出正確的表達,因此我的帖子。至於你建議的替代方案,我該怎麼做?我仍然需要一種方法來查看是否有任何阿拉伯文和英文字母在該字符串中。你建議哪種算法?因爲直接的方式是嵌套循環。與正則表達式相比,這不是很糟糕嗎? – user3340667

回答

0

執行的按照你的想法,正確的模式是:

pattern = Pattern.compile("(?=.*\\p{InArabic})(?=.*[a-zA-Z\\p{Punct}])"); 

在字符串中的相同位置不能跟一個阿拉伯字母和標點符號或在同一時間一個拉丁字母。換句話說,你寫了一個總是假的條件。添加.*允許字符位於字符串中的任何位置。

如果你想更優化的模式,你可以使用傑森ç想法,但負字符類,以減少回溯:

pattern = Pattern.compile("\\p{inArabic}[^a-zA-Z\\p{Punct}]*[a-zA-Z\\p{Punct}]|[a-zA-Z\\p{Punct}]\\P{inArabic}*\\p{inArabic}"); 
+0

謝謝。這適用於示例輸入。但我認爲我犯了一個錯誤。 (?=正則表達式)這是向前看的權利?所以基本上,如果我要讀你的正則表達式,首先在字符串中查找任何阿拉伯字符。這個角色可以單獨定位,也可以定位在單詞的末尾。一旦你找到它,看看任何英文字母或標點符號。這些可以單獨或在單詞的最後找到。 PLZ告訴我我是否正確,因爲可能存在輕微的誤解。 – user3340667

+0

@ user3340667:字符可以無處不在。 –

+0

@Jason C啊是的你編輯的評論現在更有意義。謝謝你們倆。 – user3340667

0

如果你想找到一個混行,你真正需要的是2邊界條件檢查。
成功匹配表示混合。

# "\\p{InArabic}(?=[\\w\\p{Punct}])|(?<=[\\w\\p{Punct}])\\p{InArabic}" 

    \p{InArabic} 
    (?= [\w\p{Punct}]) 
| 
    (?<= [\w\p{Punct}]) 
    \p{InArabic} 
+0

有特定條件。如果一行以數字開頭,並且該行包含阿拉伯語,那麼請執行一些操作。如果一行包含阿拉伯語和英語,然後做一些事情。如果一行以標點符號結束幷包含阿拉伯語,那麼請執行一些操作。最後,如果一行包含阿拉伯文和unicode字符,則會執行某些操作。我寫了下面的正則表達式。它不檢查unicode。你怎麼看? 「(^ [0-9] + * \\ p {InArabic})|(\\ p {InArabic} * \\ p {PUNCT} $。)|(?= * \\ p {InArabic})( ?=。* [A-ZA-Z])」 – user3340667