繁体   English   中英

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

[英]I don't understand this Textile Regex

我在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

有些事情需要注意:

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

总而言之,它匹配由[(])包围的"TM"不区分大小写(它们不需要匹配: "[TM)"在大多数情况下将匹配)。 我说在大多数情况下,因为\\b ? 将导致"[tm)"从下面的演示中的匹配中排除,因为它前面是". " ,它与\\b ?不匹配\\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风味:

[([]

是一个由(和[和]组成的字符类

[])] 

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

[\])]

代替。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM