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

mic*_*xer 3 php regex perl

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

/\b ?[([]TM[])]/i
Run Code Online (Sandbox Code Playgroud)

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

有人能解释一下这个问题吗?

Bar*_*ers 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
Run Code Online (Sandbox Code Playgroud)

有些事情需要注意:

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

总而言之,它匹配"TM"[or (]or 包围的不区分大小写)(它们不需要匹配:"[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]
        )

)
*/
Run Code Online (Sandbox Code Playgroud)