2013-07-04 63 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