我不明白这个纺织正则表达

时间:2013-02-08 08:49:08

标签: php regex perl

我在Textism Textile的PHP代码中找到了以下正则表达式:

/\b ?[([]TM[])]/i

我认为自己在阅读正则表达方面经验丰富,但这对我来说是一个谜。开始很简单,但我不明白为什么在已打开的角色类[[][]]中有两个空字符类?

有人可以解释这个问题吗?

2 个答案:

答案 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风味:

[([]

是一个由(和[和

[])] 

是另一个由]和)组成的。大多数正则表达式引擎都需要编写第二个字符类

[\])]

代替。