http://php.net/manual/en/function.preg-quote.php:
特殊的正则表达式字符是:。 \ + *? [^] $(){ } =! < > | : -
但是this page表示特殊字符为[ \ ^ $ . | ? * + ( )
好的我知道第一页是专门针对php正则表达式的。但是,为什么我们需要逃避!
,<
,>
,:
,=
,-
?
我试图preg_match
而没有转义<
,>
,-
和!
,而且一切正常。
答案 0 :(得分:5)
这些字符是元字符,但它们不需要转义。他们的共同点是它们出现在特殊的分组结构中:
(?:...) # non-capturing group
(?=...) # positive lookahead
(?!...) # negative lookahead
(?<name>...) # named capturing groups
(?<=...) # positive lookbehind
(?<!...) # negative lookbehind
(?>...) # atomic group
但他们在这方面只具有特殊意义。因此,如果您获取任何字符串并转义所有这些字符:[\^$.|?*+(){
,那么您将得到一个与字符串逐字符完全匹配的正则表达式,因为其他元字符永远不会出现在元上下文中。
例如,如果之前未转义的]
打开了一个字符类,[
只是一个元字符。
同样,-
只是字符类中的元字符,意为“范围”,如[a-z]
(或文字-
,如[abc-]
子>
因此,要转义字符串[tag-soup]
,您只需要转义[
。在字符类之外,]
和-
只被视为文字。
总之,如果你取一个字符串并转义所有“无条件”元字符([\^$.|?*+(){
),那么你得到一个与字符串字符完全匹配的正则表达式。
答案 1 :(得分:4)
您链接的页面标题为“基本正则表达式语法”。有一个标题为"advanced regex syntax"的网页的链接。这里使用了您指定的所有额外字符。
!
用于负向前瞻和后视镜<
用于lookbehinds >
用于原子组:
用于仅为正则表达式的一部分设置标记=
用于积极的前瞻和后瞻-
用于字符范围和调整标记答案 2 :(得分:3)
破折号是角色类中的特殊字符:
[a-zA-Z0-9]
其他人在匹配组中具有重要意义,例如前瞻/后视:
(?<=foo)
(?!bar)
我同意你的意见,这些都不需要逃脱。一旦括号和方括号被转义,这些其他字符就失去了它们的特殊含义。
答案 3 :(得分:1)
答案 4 :(得分:1)
许多角色仅在特定情境中特殊。从基本的,例子:
/-/ # dash
/[a-z]/ # range
/[-a-z]/ # a-z or dash
/[^]/ # literal
/^/ # meta-character
/!/ # literal
/(?!...)/ # meta-character