2013-04-10 29 views
4

我從this甲骨文教程採取java的正則表達式,以下位:正則表達式java。爲什麼使用交集?

交叉口

要創建一個字符類匹配的唯一共同 其所有嵌套類的字符,請使用& & ,如[0-9 & & [345]]。此 特定交叉點創建單個字符類匹配僅 數字通用於字符類:3,4,5

輸入您正則表達式:[0-9 & & [345]]輸入輸入要搜索的字符串:3 I 找到從索引0開始到索引1結束的文本「3」。

爲什麼它會有用?我的意思是如果一個人只想模式爲什麼不只是[]而不是「交叉點」?

在此先感謝。

+1

如果您有兩組數字,並且想要查看給定數字是否在兩個範圍內,那麼這將非常有用。爲什麼它不會有用? – Darwind 2013-04-10 15:33:02

+5

在這個微不足道的情況下,它沒有用處。他們只是舉一個簡單的例子來說明交叉口如何工作。如果你正在動態生成正則表達式,那麼這可能是有用的。否則,我通常會找到'[0-9 && [^ 45]]'這個更典型用例的例子。 – DaoWen 2013-04-10 15:36:45

回答

4

讓我們考慮一個簡單的問題:在字符串中匹配英語輔音。清單的所有輔音(或範圍的列表)將是單向的:

[B-DF-HJ-NP-TV-Zb-df-hj-np-tv-z] 

另一種方法是使用環視:

(?=[A-Za-z])[^AEIOUaeiou] 
(?![AEIOUaeiou])[A-Za-z] 

不知道是否有任何其他方式做到這一點不使用字符類交集。

字符類交集液(渣):

[A-Za-z&&[^AEIOUaeiou]] 

對於.NET,沒有交集,但字符類減法:

[A-Za-z-[AEIOUaeiou]] 

我不知道的實施細則,但如果字符類交集/減法比使用查找更快,如果字符類操作不可用,這是最乾淨的選擇,我不會感到驚訝。

另一種可能的用法是當你有一個預建的字符類,你想從中刪除一些字符。我遇到類交叉點可能適用的一種情況是匹配所有空白字符,除了新行。

另一種可能的使用情況下,@beerbajay曾這樣評價:

我覺得內置的字符類是主要的用例,例如[\p{InGreek}&&\p{Ll}]爲小寫希臘字母。

+0

我認爲內置的字符類是主要的用例, '[\ p {InGreek} && \ p {Ll}]'小寫的希臘字母。 – beerbajay 2013-04-11 01:48:16

+0

@beerbajay:你可能是對的。我還沒有碰到這個用例(呃,我們是否遇到了一些用例,取決於我們在做什麼)。 – nhahtdh 2013-04-11 01:55:40

+0

此答案已添加到「字符類」下的[Stack Overflow Regular Expression FAQ](http://stackoverflow.com/a/22944075/2736496)中。 – aliteralmind 2014-04-10 00:17:55

相關問題