问题
当正则表达式被@符号包围时,它是什么意思?这是否意味着与斜线环绕不同?什么时候@x或@i结束了?现在我想一想,周围的斜线甚至意味着什么?
背景
我看到约翰库格曼发布的this StackOverflow answer,他展示了严肃的正则表达技能。
现在,我习惯于在
中看到被斜杠包围的正则表达式/^abc/
但是他使用了@符号包围的正则表达式:
'@
^%
(.{2}) # State, 2 chars
([^^]{0,12}.) # City, 13 chars, delimited by ^
([^^]{0,34}.) # Name, 35 chars, delimited by ^
([^^]{0,28}.) # Address, 29 chars, delimited by ^
\?$
@x'
事实上,它似乎采用以下格式:
@^abc@x
在试图谷歌这意味着什么(谷歌这是一个棘手的问题!)的过程中,我也看到了格式:
@^abc@i
很明显 x 且 i 不匹配字符。
那么这一切意味着什么呢?
提前感谢任何和所有回复,
-gMale
答案 0 :(得分:5)
周围的斜杠只是正则表达式的分隔符。你可以使用任何角色(afaik)来做到这一点 - 最常用的是/,我见过的其他常用的是#
换句话说,@whatever@i
与/whatever/i
基本相同(i是不区分大小写的匹配的修饰符)
如果您的正则表达式包含该字符,您可能希望使用除/之外的其他内容。你可以避免逃避它,类似于使用''代替字符串而不是“”。
答案 1 :(得分:1)
从“相关”链接中找到此内容。
分隔符可以是任何不是字母数字,空格或反斜杠字符的字符。
/
是最常用的分隔符,因为它与正则表达式文字密切相关,例如在JavaScript中它们是唯一有效的分隔符。但是,可以使用任何符号。
我看到人们使用~
,#
,@
,甚至是!
来限制他们的正则表达式,以避免使用同样在正则表达式中的符号。我个人觉得这很荒谬。
一个鲜为人知的事实是,你可以使用一对匹配的括号来分隔PHP中的正则表达式。这具有巨大的优势,即在关闭分隔符和模式中显示的符号之间存在明显差异,因此不需要任何转义。我个人的偏好是:
(^abc)i
通过使用括号,我提醒自己,在匹配中,$m[0]
始终是完全匹配,子模式从$m[1]
开始。