php - 理解正则表达式

标签 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 中,以便它可以替换模式?<

问题:

  • 我的上述解释是否正确?
  • 前瞻断言是关于什么的?
  • 前导 / 和尾随 / 的目的是什么?

最佳答案

Is my above interpretation correct?

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

What is that lookahead assertion all about?

先行断言是一种匹配前面具有特定模式的字符的方法,而无需实际匹配该模式。

基本上,使用正则表达式 abcd(?=e) 来匹配字符串 abcde 将为您提供匹配项:abcd

这个匹配的原因是字符串 abcde 实际上包含:

  1. 一个一个
  2. 后跟 b
  3. 后跟 c
  4. 后跟一个 d,后面有一个 e(这是一个字符!)

重要的是要注意,在第 4 项之后它还包含一个实际的“e”字符,我们没有匹配到。

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

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

没有找到。

What is the purpose of the leading / and trailing /

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

关于php - 理解正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13646248/

相关文章:

python - 正则表达式 : Match string between two slashes if the string itself contains escaped slashes

php - 通过 -z 参数加载 xdebug

php - 本地主机 xampp 不工作

php - $(window).scroll(function () 不再适用于 chrome 和 firefox

python - 一些关于 Python 正则表达式的帮助

jquery - 如何使用 javascript 将哈希标签替换为 jquery 数据属性中的链接

php - 通过多个连接加速 MySQL 查询

php - 如何在 php 中为迭代表设置替代行颜色?

android - 特定字符开始和结束的正则表达式

regex - SED 在文件中替换