当正则表达式被@符号包围时,它是什么意思?

时间:2010-09-12 05:22:05

标签: php regex

问题

当正则表达式被@符号包围时,它是什么意思?这是否意味着与斜线环绕不同?什么时候@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

2 个答案:

答案 0 :(得分:5)

周围的斜杠只是正则表达式的分隔符。你可以使用任何角色(afaik)来做到这一点 - 最常用的是/,我见过的其他常用的是#

换句话说,@whatever@i/whatever/i基本相同(i是不区分大小写的匹配的修饰符)

如果您的正则表达式包含该字符,您可能希望使用除/之外的其他内容。你可以避免逃避它,类似于使用''代替字符串而不是“”。

答案 1 :(得分:1)

从“相关”链接中找到此内容。

分隔符可以是任何不是字母数字,空格或反斜杠字符的字符。

/是最常用的分隔符,因为它与正则表达式文字密切相关,例如在JavaScript中它们是唯一有效的分隔符。但是,可以使用任何符号。

我看到人们使用~#@,甚至是!来限制他们的正则表达式,以避免使用同样在正则表达式中的符号。我个人觉得这很荒谬。

一个鲜为人知的事实是,你可以使用一对匹配的括号来分隔PHP中的正则表达式。这具有巨大的优势,即在关闭分隔符和模式中显示的符号之间存在明显差异,因此不需要任何转义。我个人的偏好是:

(^abc)i

通过使用括号,我提醒自己,在匹配中,$m[0]始终是完全匹配,子模式从$m[1]开始。