3

我跑去preg_quote('<>')检查这些字符是否需要在正则表达式中转义,令我惊讶的是,他们回来了 escaped: \<\>

为什么这些字符需要转义?它们在正则表达式中的含义是什么?

4

1 回答 1

8

<用于定义lookbehinds
(前面没有的(?<!foo)bar匹配项)时具有重要意义barfoo

<和都>用于命名子模式,如下所示:

preg_match("/(?<area>\d{3})-(?<sub>\d{3})-(?<num>\d{4})/",$number,$m);
// now elements of the US phone number are in $m['area'], $m['sub'] and $m['num']

因此,因为它们在与其他符号一起使用时可能具有重要意义,所以它们被转义了。

然而,应该注意的是,它们在子模式中的特定位置之外没有任何意义,因此如果您手动转义,您很可能不需要转义它们。


进一步扩展:

该文档有一个完整的转义字符列表。在这里,我将列出它们以及它们的含义。

  • .匹配除换行符以外的任何单个字符(除非s设置了修饰符)
  • \转义以下字符,或开始转义序列
  • +匹配一个或多个前面的字符、类或子模式
  • *匹配零个或多个前面的字符、类或子模式
  • ?使前一项成为可选项,也用于子模式中以定义特殊行为,例如“不捕获” (?:foo)(?=foo)(?!foo)(?<=foo)(?<!foo)
  • []定义一个字符类,即。一组可以匹配的字符。大多数其他符号在字符类中没有意义。
  • ^$分别匹配字符串的开头和结尾。当m修饰符存在时,它还匹配各行的开始和结束。
  • ()定义一个子模式,单独用于捕获或?用于特殊行为。对于应用量词也很有用,例如\d{1,3}(?:,\d{3})*匹配千位分隔的数字。
  • {}手动量化前一项。接受一个或两个数字,用逗号分隔。示例包括{3}精确匹配 3 次、{,3}匹配 0 到 3 次、{3,}匹配 3 次或更多次以及{3,8}匹配 3 到 8 次。
  • =在前瞻断言中使用:foo(?=bar)匹配foo,但仅当它后跟bar.
  • !用于否定环视断言:foo(?!bar)匹配foo,但如果后面跟着. 则不匹配bar
  • <>此问题的主题,请参阅答案的开头以获取信息。
  • |交替,指定可能性列表。它有点像一个字符类,但用于整个模式而不是单个字符。foo|bar匹配“foo”或“bar”。也可以被视为子模式中的一种特殊行为:(?|foo(bar)|bar(foo))确保括号中的任何位都将在子模式 1 中(否则,bar如果匹配则在 1 中,如果匹配foo则在 2 中,不匹配的位将为空)
  • :在子模式中使用以使它们不被捕获。本质上,子模式只是变成了一个“字符组”,通常会被量化。(?:foo)匹配但不捕获“foo”。
  • -定义字符类中的字符范围。除了一个之外没有任何意义。
于 2013-11-05T16:49:20.483 回答