2013-07-04 62 views
0

是否有可能在Java中編寫與字符部分匹配的正則表達式?例如,我想搜索字符串'ab','cd'和'ef'。一場比賽應該在下面的例子將返回:Java正則表達式 - 字的部分

[lab stef ecde], [lecde effe aaaab] 

所以,如果所有字符串(「AB」,「CD」,「EF」)是在文本的任何地方單詞的一部分匹配應返回 - 爲了不進口。 但是比賽不應該被若有字符串丟失

[lab stef] 

回答

5

發現每串輸入和&&產生的boolean值返回。

String s = "lab stef ecde"; 
boolean ab = s.indexOf("ab") > -1; 
boolean cd = s.indexOf("cd") > -1; 
boolean ef = s.indexOf("ef") > -1; 
boolean match = ab && cd && ef; // true 

編輯

在德國有一句諺語:

Warum einfach wenn es auch kompliziert geht?

"Why simple when you can do it complicated?"

這就是我想在這種情況下,正則表達式。

+1

是的,如果你匹配常量字符串,使用正則表達式是a)比你需要更復雜,b)更昂貴。 – CosmicComputer

+0

「abcdef」怎麼樣? –

+1

使用這種方法也可以讓你比使用正則表達式更容易提供錯誤報告。例如,您可以爲每個檢查打印一條消息「錯誤:不匹配___」。 –

6

如果它不一定是正則表達式然後Tichodroma's answer是你正在尋找的。

但如果你真的需要複雜的生活,並使用正則表達式,你可以嘗試使用環視機制,例如look ahead和創造這樣

"lab stef ecde".matches("(?=.*ab)(?=.*cd)(?=.*ef).*") //true 
"lab stef".matches("(?=.*ab)(?=.*cd)(?=.*ef).*") //false 

更清楚地解釋:在

(?=.*ab)(?=.*cd)(?=.*ef).* 
  • (?=.*ab)會檢查你的字符串包含.*ab其中.*將匹配ab部分之前的任何字符。
  • 也向前看(?= ...)是零寬度,這意味着它會將光標重置到預先開始之前的位置,因此在我們的情況下它仍然位於字符串的起始處
  • 這種方式,我們可以再次使用(?=.*cd)(?=.*ef)
  • 但我們還需要我們在最後的正則表達式.*包括,因爲matches檢查,如果整個字符串我們正則表達式匹配,所以我們需要在整個字符串莫名其妙迭代。
0

這樣做:

^.*(ab.*cd.*ef|ab.*ef.*cd|cd.*ab.*ef|cd.*ef.*ab|ef.*ab.*cd|ef.*cd.*ab).*$ 

你可以在這裏進行測試:http://www.regexplanet.com/advanced/java/index.html

我相信這是矯枉過正,但。另一個優化的解決方案會更好。

+1

不是很好,容易出錯。 – 2013-07-04 13:52:52

+0

是的,你不會用純正則表達式解決這個問題。廢話 – Multithreader