理解正则表达式

时间:2012-11-30 13:29:32

标签: php regex

我厌倦了对正则表达式的恐惧。这篇文章的主题仅限于正则表达式的PHP实现,但是,任何通用的正则表达式建议显然都会受到赞赏(即不要混淆我不适用于PHP的范围)。

以下(我相信)将删除数字之间的任何空格。也许有更好的方法,但我仍然想了解发生了什么。

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

通过这种模式,我的解释是:

  • \b字边界
  • \d+一个或多个数字的子模式
  • \s+一个或多个空格
  • (?=\d+\b)前瞻断言一个或多个数字后跟一个单词边界?
  • 把它们放在一起,搜索任何单词边界,然后是一个或多个数字,然后是一些空格,然后对它进行某种先行断言,并将结果保存在$ 1中,以便它可以替换模式?

问题:

  • 我的上述解释是否正确?
  • 所有关于前瞻性断言的内容是什么?
  • 领先/和尾随/
  • 的目的是什么?

2 个答案:

答案 0 :(得分:18)

  

我的上述解释是否正确?

是的,你的解释是正确的。

  

所有关于前瞻性断言的内容是什么?

前瞻性断言是一种方法,可以匹配前面具有特定模式的字符,而无需实际匹配模式。

所以基本上,使用正则表达式abcd(?=e)匹配字符串abcde会给你匹配:abcd

匹配的原因是字符串abcde确实包含:

  1. a
  2. 后跟b
  3. 后跟c
  4. 后面跟着d that has an e after it(这是一个字符!)
  5. 重要的是要注意,在第4项之后它还包含一个实际的“e”字符,我们不匹配。

    另一方面,尝试将字符串与正则表达式abcd(?=f)匹配将失败,因为序列:

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

      

    领先/和/ /

    的目的是什么?

    这些是分隔符,在PHP中用于区分字符串的模式部分和字符串的修饰符部分。分隔符可以是任何字符,但我自己更喜欢@符号。请记住,如果在模式中使用了要用作分隔符的字符,则需要对其进行转义。

答案 1 :(得分:6)

观看此视频是个好主意,以及随后的4个视频: http://blog.themeforest.net/screencasts/regular-expressions-for-dummies/ 本系列的其余部分可在此处找到: http://blog.themeforest.net/?s=regex+for+dummies

一位同事给我发了这个系列,在看了他们之后,我更习惯使用正则表达式。

另一个好主意是安装RegexBuddy或Regexr。特别是RegexBuddy对于理解正则表达式的工作非常有用。