3

TextismTextileのPHPコードで次の正規表現を見つけました。

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

私は自分自身が正規表現を読んだ経験があると思いますが、これは私には謎です。最初は簡単ですが、すでに開いている文字クラスの中に2つの空の文字クラスがある理由がわかりません[[][]]

誰かがこの問題に光を当てることができますか?

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"のいずれかで囲まれた大文字と小文字を区別しないものと一致します(一致する必要はありません。ほとんどの場合、一致します)。ほとんどの場合、前に一致しないものが続くため、以下のデモの一致から除外されるためです。[(])"[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フレーバーを提供しました。

[([]

(と[および

[])] 

]と)で構成されるもう1つのものです。ほとんどの正規表現エンジンでは、2番目の文字クラスを記述する必要があります

[\])]

代わりは。

于 2013-02-08T08:53:50.007 に答える