我發現在Textism紡織品的PHP代碼如下正則表達式:我不明白這個紡織正則表達式
/\b ?[([]TM[])]/i
我認爲自己在閱讀正則表達式的經歷,但這個是一個謎給我。開始很簡單,但我不明白爲什麼在已經打開的字符類[[][]]
中有兩個空字符類?
有人可以解釋一下這個問題嗎?
我發現在Textism紡織品的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 ?
:
<?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味:
[([]
是一個字符類由(並[和
[])]
是另一個由]和)。大多數正則表達式引擎需要寫第二個字符類別
[\])]
改爲。
但不應該顯示錯誤。第二個''''可能被認爲是關閉prevoius的一個'['?在Java中,該正則表達式是錯誤的。 –
對,正是我困惑。 – micxer
你似乎是對的。根據Javascript,正則表達式似乎也是無效的。 –
該正則表達式不編譯... – lonesomeday
正則表達式編譯正確。 –
@ lonesomeday,這一切都取決於您使用的語言/工具。這是一個有效的PCRE。看到我的答案。 –