2013-11-15 9 views
1

在這個問題上:Split text into words problem PHP, complicated problem需要了解的正則表達式張貼作爲一個答案到另一個查詢

的回答給了以下的正則表達式來分割字符串成詞,意識到一個小數點和一個句號之間的差異。

/([\s_;?!\/\(\)\[\]{}<>\r\n"]|\.$|(?<=\D)[:,.\-]|[:,.\-](?=\D))/

這對我的作品,但我想知道爲什麼它的工作原理,讓我最終能寫我自己的這些東西。所以,我的要求是:

請通過該正則表達式,並解釋每個部分的作用。

回答

4

在原來討論的問題是,OP想分裂周圍所有這些特殊字符,但是當有一個小數點像3.14在字符串中的數字問題就來了四周,他在結果中得到了BOT 314 ,而他只想要3.14本身。

OK,我們目前的問題,讓我們打破你的表達成片:

/([\s_;?!\/\(\)\[\]{}<>\r\n"]|\.$|(?<=\D)[:,.\-]|[:,.\-](?=\D))/ 
          ^^   ^

正如你所看到的正則表達式使用的交替,所以無論是第一塊[\s_;?!\/\(\)\[\]{}<>\r\n"],第二件\.$,第三匹配一塊(?<=\D)[:,.\-]或第四塊[:,.\-](?=\D))

第一片:[\s_;?!\/\(\)\[\]{}<>\r\n"]

這一個匹配以下字符中的一個:空間_;?!/()[]{}<>,回車\r,換行\r"

第二塊\.$:僅在位於字符串末尾時匹配點

第三件:(?<=\D)[:,.\-]這符合以下任何字符的:,.-只要他們不是一個數字(?<=\D)後,使之類的東西3.1423:23不會導致分裂。

第四和最後一塊:[:,.\-](?=\D)此匹配任何下列字符:,.-只要它們後跟一個字符這不是一個數字(?=\D)

此規則是第三條規則的補充。

+0

最讓我失望的是所有逃脫的文字,而我現在剛剛完全理解了我所聽到的所謂「後視」(在這種情況下,由於「D」是大寫)和「向前看」。謝謝。 – TecBrat

+0

@TecBrat不客氣,很高興我能提供幫助。 –

+0

請注意,如果這些模式位於字符串的開頭或結尾,則不會刪除以下字符'[:,.-]'。爲了解決這個問題,你必須把變量改爲'(?<!\ d)'和'(?!\ d)'。另一個關於字符類的東西,你可以將第一個縮寫爲'[] [(){} <> \/\ s _;?!「]'並且你不需要轉義'-'(因爲它在('!,.-](?!\ d)' –

3

這個正則表達式的四個備選部分,解釋...

[\s_;?!\/\(\)\[\]{}<>\r\n"] 

第1部分:似乎是匹配任何試圖不是一個字母,數字或潛在數字分隔(中這更多在一瞬間)。

\.$ 

第2部分:匹配字符串末尾的句點/句號。

(?<=\D)[:,.\-]|[:,.\-](?=\D) 

零件3/4:匹配一個號分離器(結腸,逗號,句號/句號,減號)只有當它是立即之前或之後的非數字字符。

3

只是爲了將來的參考添加,如果你有谷歌Explain Regular Expression幾個網站的工具來解析表達式,並將其分解成片斷,下面的解釋將顯示出來。

要以起始斜槓/開始並結尾斜槓/是您的分隔符。

甲分隔符可以是任何非字母數字非反斜槓非空白字符

你的正則表達式:

(        group and capture to \1: 
[\s_;?!\/\(\)\[\]{}<>\r\n"] any character of: whitespace (\n, \r, \t, \f, and " "), 
           _ ; ? ! \/ \(\) \[ \] { } < > \r \n " 
|        OR 
\.       '.' 
    $       before an optional \n, and the end of the string 
    |       OR 
    (?<=       look behind to see if there is: 
    \D       non-digits (all but 0-9) 
)       end of look-behind 
    [:,.\-]      any character of: ':', ',', '.', '\-' 
    |       OR 
    [:,.\-]      any character of: ':', ',', '.', '\-' 
    (?=       look ahead to see if there is: 
    \D       non-digits (all but 0-9) 
)       end of look-ahead 
)        end of \1 

從本質上講,你有你的\r\n字符類中,並可以刪除的部分,因爲\s將匹配那些本身。通常只有某些字符需要在字符類中轉義。

(?:[(){}\[\]<>\/!?;_"\s]|\.$|(?<=\D)([;.,-])|(?1)(?=\D)) 

demo

希望這有助於!祝你好運。

+0

+1,只是爲了鏈接 – TecBrat

+0

@Casimir et Hippolyte它已經恢復了 – hwnd

+0

@hwnd:謝謝!我已經發布了一些例子。 –

相關問題