Php 理解正则表达式

Php 理解正则表达式,php,regex,Php,Regex,我厌倦了对正则表达式的恐惧。这篇文章的主题仅限于正则表达式的PHP实现,但是,任何通用正则表达式的建议都将受到赞赏(即,不要把我与不适用于PHP的范围混淆) 下面(我相信)将删除数字之间的空白。也许有更好的办法,但我还是想知道到底发生了什么 $pat="/\b(\d+)\s+(?=\d+\b)/"; $sub="123 345"; $string=preg_replace($pat, "$1", $sub); 通过这种模式,我的解释是: \b单词边界 \d+一个由1个或多个数字组成的子模式

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

下面(我相信)将删除数字之间的空白。也许有更好的办法,但我还是想知道到底发生了什么

$pat="/\b(\d+)\s+(?=\d+\b)/";
$sub="123 345";
$string=preg_replace($pat, "$1", $sub);
通过这种模式,我的解释是:

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

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

是的,你的解释是正确的

前瞻性断言是关于什么的?

前瞻断言是一种匹配前面有特定模式的字符的方法,而不必实际匹配模式

因此,基本上,使用正则表达式来匹配字符串
abcde
将得到匹配:
abcd

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

  • a
    a
  • 后跟a
    b
  • 后跟一个
    c
  • 后跟一个
    d,后面有一个e
    (这是一个字符!)
  • 需要注意的是,在第4项之后,它还包含一个实际的“e”字符,我们没有匹配

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

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

    前导/尾随的目的是什么


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

    最好观看此视频以及随后的4个视频: 本系列的其余部分可在此处找到:

    一位同事把这个系列发给我,看完之后,我对使用正则表达式感到非常舒服


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

    有关参考和教程:*另请参阅和,以获取一些有用的工具,或参考手册。谢谢。现在就看一下deceze的建议。我会看看其他的。虽然基于ruby的regex(不确定是否有太大的区别),但我也发现自己是一个更容易使用的在线regex测试人员。我强烈建议你使用它,以便更容易掌握你的regex技能(调试正则表达式和测试对regexp语句的不同修改也容易得多。)但是“a”,后面跟着“b”,后面跟着“c”,后面跟着“d”,前面有一个e(不是e不是f)不匹配。请您详细说明。@user1032531当然,给我几分钟。Marten,很抱歉,我想我无意中推翻了您建议的编辑,但现在问题中出现了这些信息。啊哈,分隔符!所以我只有在有修饰符的情况下才需要它们,对吗?看,头是“零宽度”断言,意味着它们不包括在内在匹配中。因此,
    abcd(?=e)
    只有在后面跟一个
    e
    时才说match
    abcd
    。关于分隔符,preg_replace(“[^a-zA-Z0-9]”,“'Hello[$&goodby')没有任何分隔符(除非方括号用作分隔符)。它无效吗?谢谢Maarteen00,我会检查它。