2013-02-08 35 views
3

我發現在Textism紡織品的PHP代碼如下正則表達式:我不明白這個紡織正則表達式

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

我認爲自己在閱讀正則表達式的經歷,但這個是一個謎給我。開始很簡單,但我不明白爲什麼在已經打開的字符類[[][]]中有兩個空字符類?

有人可以解釋一下這個問題嗎?

+1

該正則表達式不編譯... – lonesomeday

+2

正則表達式編譯正確。 –

+1

@ lonesomeday,這一切都取決於您使用的語言/工具。這是一個有效的PCRE。看到我的答案。 –

回答

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 ?

<?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] 
     ) 

) 
*/ 
+0

但不應該'('和')'逃脫? –

+0

感謝您的明確解釋。似乎只適用於Perl兼容的Regex機器。 – micxer

+0

@Krishna不需要在字符類中轉義'('和')'。 –

2

如果正則表達式遵循正則表達式的POSIX風格,編輯:]似乎被允許作爲字符類的第一個字符。見http://www.regular-expressions.info/posixbrackets.html。在PHP中,eregs_函數使用POSIX,而preg_函數使用不允許此構造的較新PCRE風味。

所以,提供POSIX味:

[([] 

是一個字符類由(並[和

[])] 

是另一個由]和)。大多數正則表達式引擎需要寫第二個字符類別

[\])] 

改爲。

+0

但不應該顯示錯誤。第二個''''可能被認爲是關閉prevoius的一個'['?在Java中,該正則表達式是錯誤的。 –

+0

對,正是我困惑。 – micxer

+0

你似乎是對的。根據Javascript,正則表達式似乎也是無效的。 –