2017-07-10 40 views
2

封閉的話我有一個包含由2個空格開頭封閉,另2月末喜歡這個詞的文字:java的正則表達式匹配4位

「my_text_is__separated__like_this__example__」

所以我想檢索'分離'和'示例'。

我實現了這種方式:

String pattern = "\\s{2}(\\w+)\\s{2}"; 

    String t = getText(); 
    Pattern p = Pattern.compile(pattern); 
    Matcher m = p.matcher(t); 
    StringBuilder b = new StringBuilder(); 
    while (m.find()) { 
     b.append(m.group(1) + "xxx\n"); 
    } 
    Log.d("hmmmmm", b.toString()); 

,但它不工作(m.find()是假的)。


編輯:這裏是我的文字:

حدثناالحميديعبداللهبنالزبيرقالحدثناسفيانقالحدثنايحيىبنسعيدالأنصاري قالأخبرنيمحمدبنإبراهيمالتيميأنهسمععلقمةبنوقاصال يثييقولسمعتعمربنالخطابرضياللهعنىعلىالمنبرقالسمعترسولاللهصلىاللهعليهوسلميقولإنماالأعمالبالنياتوإنمالكلامرئمانوىفمنكانت هجرتهإلىدنيايصيبهاأوإلىامرأةينكحهافهجرتهإلىماهاجرإليه。

'سفيان' 和 'بالنيات' 比如應該是輸出


中:在這個例子中,我換成(_)的空間,使其成爲更加明顯。

note:我的文本在阿拉伯語

編輯:原來它沒有用雙空格隔開,請參閱下面的答案。

+0

也許你可以給出一個可用於測試的實際示例字符串。 –

+0

@ OH GOD蜘蛛我更新了問題。 – UpsideDownTree

+0

還顯示預期的輸出與阿拉伯文字? – anubhava

回答

3

Java的Pattern定義的「單詞字符」 \w作爲[a-zA-Z_0-9],所以阿拉伯文字不匹配(旁註:歐洲口音不匹配或者,例如「平等就業機會」)。

根據this answer您可以使用[\u0600-\u06FF]阿拉伯語而不是\w
根據that answer你可以使用\p{InArabic},這似乎更好。

此外,您的文本片段不包含2個連續的空白字符,因此\s{2}將不會得到任何匹配。看起來像「雙空間」的眼睛實際上是空格,然後是unicode right-to-left mark,它是十六進制的200F。因此可以與\\s\\x{200f}(\\p{InArabic}+)\\s\\x{200f}匹配。 例子:

System.out.println(Arrays.toString(new boolean[] { 
      "### hey ###".matches(".*\\s{2}\\w+\\s{2}.*"), 
      "### tût ###".matches(".*\\s{2}\\w+\\s{2}.*"), 
      "### لتَّيْم ###".matches(".*\\s{2}\\w+\\s{2}.*"), 
      "### لتَّيْم ###".matches(".*\\s{2}\\p{InArabic}+\\s{2}.*") 
    })); 
    Matcher matcher = Pattern.compile("\\s\\x{200f}(\\p{InArabic}+)\\s\\x{200f}").matcher(getText()); 
    while (matcher.find()) { 
     System.out.println(matcher.group(1)); 
    } 

其中getText()回報您的文本片段,這個打印:

[true, false, false, true] 
سُفْيَانُ 
يَقُولُ 
بِالنِّيَّاتِ 
يُصِيبُهَا 

現在,我不知道它是否期待您的文本包含圍繞特定的詞語,標誌好事,並明確地匹配: -/

我不知道regexr.com是如何工作的,因爲我認爲JavaScript \w的含義與Java相同(並且我沒有看到網絡往返,所以它必須用JS實現,親儘管有一些轉化層)。即使是自己的嵌入式醫生說這個約\w

匹配任何單詞字符(字母數字&下劃線)。只匹配low-ascii字符(不包含重音或非羅馬字符)。等效於[A-Za-z0-9_]

+0

(對不起,我的連接有問題) 所以我做了以下操作:String pattern =「\\ s {2}([\\ u0600 - \\ u06FF] +)\\ s {2 }「;它也不起作用,另外,regexr.com甚至沒有接受我的阿拉伯語文本,但它在英文文本中運行良好。 – UpsideDownTree

+0

請參閱我的編輯,對於unicode字符類,在'u'之前需要單個反斜槓,所以'\ u' –

+0

它不起作用,是因爲幾乎每個單詞都以一個變音字母開頭/結尾? – UpsideDownTree