理解正则表达式

use*_*531 18 php regex

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

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

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

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

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

问题:

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

Asa*_*din 18

我的上述解释是否正确?

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

什么是前瞻性断言?

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

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

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

  1. 一个 a
  2. 接下来是一个 b
  3. 接下来是一个 c
  4. 接下来是d that has an e after it(这是一个单个字符!)

重要的是要注意,在第4项之后它还包含一个实际的"e"字符,我们不匹配.

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

"a", followed by "b", followed by "c", followed by "d that has an f in front of it"
Run Code Online (Sandbox Code Playgroud)

找不到.

领先/尾随/的目的是什么?

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

  • 前瞻是'零宽度'断言,意味着它们不包含在匹配中.所以`abcd(?= e)`只是说'abcd`**匹配**,如果后跟一个`e`. (2认同)

Maa*_*n00 6

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

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

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