我厌倦了对正则表达式的恐惧。这篇文章的主题仅限于正则表达式的PHP实现,但是,任何通用的正则表达式建议显然都会受到赞赏(即不要混淆我不适用于PHP的范围)。
以下(我相信)将删除数字之间的任何空格。也许有更好的方法,但我仍然想了解发生了什么。
$pat="/\b(\d+)\s+(?=\d+\b)/";
$sub="123 345";
$string=preg_replace($pat, "$1", $sub);
通过这种模式,我的解释是:
\b
字边界\d+
一个或多个数字的子模式\s+
一个或多个空格(?=\d+\b)
前瞻断言一个或多个数字后跟一个单词边界?问题:
/
和尾随/
?答案 0 :(得分:18)
我的上述解释是否正确?
是的,你的解释是正确的。
所有关于前瞻性断言的内容是什么?
前瞻性断言是一种方法,可以匹配前面具有特定模式的字符,而无需实际匹配模式。
所以基本上,使用正则表达式abcd(?=e)
匹配字符串abcde
会给你匹配:abcd
。
匹配的原因是字符串abcde
确实包含:
a
b
c
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"
找不到。
领先/和/ /
的目的是什么?
这些是分隔符,在PHP中用于区分字符串的模式部分和字符串的修饰符部分。分隔符可以是任何字符,但我自己更喜欢@
符号。请记住,如果在模式中使用了要用作分隔符的字符,则需要对其进行转义。
答案 1 :(得分:6)
观看此视频是个好主意,以及随后的4个视频: http://blog.themeforest.net/screencasts/regular-expressions-for-dummies/ 本系列的其余部分可在此处找到: http://blog.themeforest.net/?s=regex+for+dummies
一位同事给我发了这个系列,在看了他们之后,我更习惯使用正则表达式。
另一个好主意是安装RegexBuddy或Regexr。特别是RegexBuddy对于理解正则表达式的工作非常有用。