2013-10-21 167 views
0

我一直在試圖研究正則表達式;但是,我似乎無法理解這兩個正則表達式的意思。複雜的正則表達式

private static final Pattern BALANCED_TEXT = 
    Pattern.compile("(?s)((?:\\\\.|[^\\\\{}]" 
        + "|[{](?:\\\\.|[^\\\\{}])*[}])*)" 
        + "\\}" 
        + "|."); 

private static final Pattern INPUT_PATTERN = 
    Pattern.compile("(?s)(\\p{Blank}+)" 
        + "|(\\r?\\n((?:\\r?\\n)+)?)" 
        + "|\\\\([\\p{Blank}{}\\\\])" 
        + "|\\\\(\\p{Alpha}+)([{]?)" 
        + "|((?:[^\\p{Blank}\\r\\n\\\\{}]+))" 
        + "|(.)"); 

我將不勝感激,如果有人可以深入解釋這兩個正則表達式語句給我。提前致謝!

+0

根據[documentation](http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html)'(?s)'是DOTALL標誌。它會讓點'.'也匹配新的線條標記。 '\\ p {空白}'與空格或製表符'[\ t]'相同,因此您可以在正則表達式中替換它。 '\\ p {Alpha}'與'[\ p {Lower} \ p {Upper}]'相同,與'[a-zA-Z]'相同。現在只需打印'BALANCED_TEXT'和'INPUT_PATTERN'並在https://www.debuggex.com/和http://regex101.com/上使用它們來查看它們的工作方式。如果需要也刪除'(?s)'。 – Pshemo

+0

我很困惑什麼?:和[^ \\\\ {}]的意思。還有什麼是+號的重點? –

+1

你說你有bean試圖學習正則表達式:/'+'表示元素或組在重複一次或多次之前。 '(?:xxx)'是[非捕獲組](http://stackoverflow.com/q/3512471/1393766)。 '[^ abc]'表示除['^ ...]之外的所有字符,所以在[[\\\\ {}]的情況下,它與每個字符相同,但不是\,{,或} 。 – Pshemo

回答

2

整個第一正則表達式是:

(?s)((?:\\\\.|[^\\\\{}]|[{](?:\\\\.|[^\\\\{}])*[}])*)\\}|.

首先,你應該用java字符串轉義(例如\\意味着\)做掉。你得到一個正則表達式:

(?s)((?:\\.|[^\\{}]|[{](?:\\.|[^\\{}])*[}])*)\}|.

的第一件事是(?s)與品牌.匹配換行符一個DOTALL標誌。 要看的第二件事是頂級結構。由於|是或運營商,擁有優先級最低,它的:

(something)\} OR SINGLE ANY CHARACTER - DOT

所以它會首先嚐試匹配的東西結束與}(因爲}是在正則表達式特殊字符它與\開頭前面的部分。 }將被匹配的,因爲它周圍的()的1組。

讓我們來看看最()裏面有什麼。

最外層的形式是(?: something)*。它將匹配0或更多的something重複。

(?:)表示裏面的內容是非捕獲組,也就是說,它不會像()那樣會在匹配中生成組。它允許|或表達式正確地彼此交替,而不包括過期條件。

讓我們看看something是什麼。這是一系列OR表達式,從左到右嘗試。

第一個是\\.相匹配\隨後(通知\\被轉義\任何字符,而.尚未逸出。

第二個是一個字符類[\\{}]這不是\{任何字符相匹配或}

第三個是我匹配字符{其次依次}(?:) 0或多個匹配。 nner (?:)匹配\後跟任何字符或不是\{}的任何字符。

所以,如果你把這個在一起,這符合:

第一部分將匹配任何與}(組結束1將不包括},而整場比賽可以最後}之前,將匹配:

  • 空字符串
  • 任何字符{之間逃脫字符\
  • 序列

更好的解釋:它除了\本身{}相當多的東西不匹配彼此,它不會匹配嵌套雙。以上例外可以通過\轉義。

它也將匹配在所有(最後.)的任何字符,但是那場比賽將有空組1.

的匹配(Java轉義)字符串樣本:

a}h{ello}}h{\{ello}}xh{\\ello}}{}}

好像是正則表達式是錯誤的,因爲它不會匹配{}但它將匹配}{}}而b名爲BALANCED_TEXT

+0

謝謝!這真的幫了很多:) –