我在Textism Textile的PHP代码中找到了以下正则表达式:
/\b ?[([]TM[])]/i
我认为自己在阅读正则表达方面经验丰富,但这对我来说是一个谜。开始很简单,但我不明白为什么在已打开的角色类[[][]]
中有两个空字符类?
有人可以解释这个问题吗?
答案 0 :(得分:9)
这是一个相当神秘的......
这就是它的含义:
/ # 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
有些注意事项:
[
并不特殊,无需转义([([]
因此有效!)[])]
因此有效:]
无需转义!)总结一下,它匹配"TM"
不区分大小写,包围[
或(
和]
或)
(它们不需要匹配:在大多数情况下,"[TM)"
将匹配)。我在大多数情况下说,因为\b ?
会导致"[tm)"
从下面的演示中的匹配中排除,因为它前面有". "
,与\b ?
不匹配:< / p>
<?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]
)
)
*/
答案 1 :(得分:2)
编辑:如果正则表达式遵循正则表达式的POSIX风格,似乎允许]
作为字符类的第一个字符。见http://www.regular-expressions.info/posixbrackets.html。在PHP中,eregs_
函数使用POSIX,而preg_
函数使用不允许此构造的较新的PCRE风格。
所以,提供了POSIX风味:
[([]
是一个由(和[和
[])]
是另一个由]和)组成的。大多数正则表达式引擎都需要编写第二个字符类
[\])]
代替。