3

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

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

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

有人可以阐明这个问题吗?

4

2 回答 2

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

需要注意的一些事项:

  • 在字符类中,[不是特殊的,不需要转义([([]因此有效!)
  • 在字符类中,第一个字符,可能是特殊字符,不需要转义([])]因此有效:]不需要转义!)

总而言之,它匹配由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]
        )

)
*/
于 2013-02-08T08:56:18.783 回答
2

编辑:]如果正则表达式遵循正则表达式的 POSIX 风格,则似乎允许作为字符类的第一个字符。请参阅http://www.regular-expressions.info/posixbrackets.html。在 PHP 中,eregs_函数使用 POSIX,而preg_函数使用不允许这种构造的更新的 PCRE 风格。

因此,提供了 POSIX 风格:

[([]

是一个由 ( 和 [ 和

[])] 

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

[\])]

反而。

于 2013-02-08T08:53:50.007 回答