2012-11-30 349 views
18

我厭倦了被正則表達式嚇倒。這篇文章的主題僅限於正則表達式的PHP實現,但是,任何泛型正則表達式的建議顯然都將被讚賞(即,不要將我與範圍不適用於PHP)混爲一談。瞭解正則表達式

以下(我相信)將刪除數字之間的任何空格。也許有更好的方式去做,但我仍然想知道發生了什麼。

$pat="/\b(\d+)\s+(?=\d+\b)/"; 
$sub="123 345"; 
$string=preg_replace($pat, "$1", $sub); 

穿過圖案化去,我的解釋是:

  • \b詞邊界
  • \d+的1個或多個數字
  • \s+一個或多個空格子模式
  • (?=\d+\b)前瞻斷言一個或多個數字後跟一個字邊界?
  • 把它放在一起,搜索任何字邊界後跟一個或多個數字,然後搜索一些空格,然後對其執行某種預測聲明,並將結果保存在$ 1中,以便它可以替換該模式?

問題:

  • 是我上面的解釋是否正確?
  • 那是什麼樣的前瞻斷言?
  • 領先的/和尾隨/的目的是什麼?
+9

參考和教程:http://regular-expressions.info – deceze

+0

*另請參閱[開源RegexBuddy替代品](http://stackoverflow.com/questions/89718/is-there)和[在線正則表達式測試] (http://stackoverflow.com/questions/32282/regex-testing)提供了一些有用的工具,或者是[mentExp.info](http://regular-expressions.info/)。 – mario

+0

謝謝。現在就查看欺騙者的建議。會看看其他人。 – user1032531

回答

18

我的上述解釋是否正確?

是的,你的解釋是正確的。

那是什麼樣的前瞻斷言?

這種前瞻斷言是一種讓你匹配在他們面前有特定模式的字符的方式,而不必實際匹配模式。

所以基本上,使用正則表達式abcd(?=e)來匹配字符串abcde會給你匹配:abcd

,這種匹配的原因是該字符串abcde實際上包含:

  1. a
  2. 其次是b
  3. 其次是c
  4. 其次是d that has an e after it(此是一個單獨的角色!)

重要的是要注意,在第四項後它還包含一個實際的「e」字符,我們不匹配。

在另一方面,試圖匹配對正則表達式abcd(?=f)字符串會失敗,因爲序列:

"a", followed by "b", followed by "c", followed by "d that has an f in front of it" 

是找不到的。

什麼是前置/和/

那些被分隔符的宗旨,在PHP中使用您的字符串從字符串的修改部分的圖案部分區分開來。分隔符可以是任何字符,但我更喜歡@。請記住,如果在模式中使用了用作分隔符的字符,則需要將其轉義。

+0

但是「a」,後跟「b」,後面跟着「c」,後面跟着「d,它前面有一個e(不是e不是f)不匹配,請您詳細說明。 – user1032531

+0

@ user1032531 Sure ,給我一分鐘貂,對不起,我想我意外地超過了你的建議編輯,但是這個信息現在出現在這個問題中了。 –

+0

啊哈,分隔符!所以我只需要它們,如果我有一個修飾符,對吧? – user1032531

6

這將是觀看這部影片是一個好主意,並遵循此4: http://blog.themeforest.net/screencasts/regular-expressions-for-dummies/ 系列的其餘部分在這裏找到: http://blog.themeforest.net/?s=regex+for+dummies

一位同事發過來的系列,看着他們之後我使用正則表達式更加舒適。

另一個好主意是安裝RegexBuddy或Regexr。特別是RegexBuddy對於理解正則表達式的工作非常有用。

+0

謝謝Maarteen00,我會檢查一下。 – user1032531