我在 Textism Textile 的 PHP 代码中找到了以下正则表达式:
/\b ?[([]TM[])]/i
我认为自己在阅读正则表达式方面经验丰富,但这对我来说是个谜。开始很容易,但我不明白为什么已经打开的字符类中有两个空字符类[[][]]
?
有人可以阐明这个问题吗?
这是一个相当神秘的...
这就是它的意思:
/ # start regex pattern
\b # word boundary
? # an optional space
[([] # char class: either '(' or '['
TM # literal 'TM'
[])] # char class: either ']' or ')'
/ # end regex pattern
i # match case insensitive
需要注意的一些事项:
[
不是特殊的,不需要转义([([]
因此有效!)[])]
因此有效:]
不需要转义!)总而言之,它匹配由or和or"TM"
包围的不区分大小写(它们不需要匹配:在大多数情况下都会匹配)。我说在大多数情况下,因为会导致在下面的演示中被排除在匹配项之外,因为它前面是which does not match :[
(
]
)
"[TM)"
\b ?
"[tm)"
". "
\b ?
<?php
preg_match_all(
'/\b ?[([]TM[])]/i',
"... [tm) foo (TM) bar [TM] baz (tm] ...",
$matches
);
print_r($matches);
?>
/*
Array
(
[0] => Array
(
[0] => (TM)
[1] => [TM]
[2] => (tm]
)
)
*/
编辑:]
如果正则表达式遵循正则表达式的 POSIX 风格,则似乎允许作为字符类的第一个字符。请参阅http://www.regular-expressions.info/posixbrackets.html。在 PHP 中,eregs_
函数使用 POSIX,而preg_
函数使用不允许这种构造的更新的 PCRE 风格。
因此,提供了 POSIX 风格:
[([]
是一个由 ( 和 [ 和
[])]
是另一个由]和)组成的。大多数正则表达式引擎需要编写第二个字符类
[\])]
反而。