我厌倦了对正则表达式的恐惧.这篇文章的主题仅限于正则表达式的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) 先行断言一个或多个数字后跟一个单词边界?问题:
/和尾随的目的是什么/?Asa*_*din 18
我的上述解释是否正确?
是的,你的解释是正确的.
什么是前瞻性断言?
前瞻性断言是一种方法,可以匹配在它们前面具有特定模式的字符,而无需实际匹配模式.
所以基本上,使用正则表达式abcd(?=e)匹配字符串abcde将给你匹配:abcd.
这匹配的原因是字符串abcde确实包含:
abcd 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中用于区分字符串的模式部分和字符串的修饰符部分.分隔符可以是任何字符,但我@自己更喜欢标记.请记住,如果在模式中使用了要用作分隔符的字符,则需要对其进行转义.
观看这个视频是个好主意,以及随后的4个视频:http: //blog.themeforest.net/screencasts/regular-expressions-for-dummies/ 本系列的其余部分可以在这里找到: http:/ /blog.themeforest.net/?s=regex+for+dummies
一位同事给我发了这个系列,在看完它们之后,我更习惯使用正则表达式.
另一个好主意是安装RegexBuddy或Regexr.特别是RegexBuddy对于理解正则表达式的工作非常有用.