Java正则表达式 - 单词的一部分

时间:2013-07-04 13:31:45

标签: java regex

是否可以在Java中编写与单词部分匹配的正则表达式?例如,我想搜索字符串'ab','cd'和'ef'。应在以下示例中返回匹配项:

[lab stef ecde], [lecde effe aaaab]

因此,如果所有字符串('ab','cd','ef')都是文本中任何位置的单词部分,则应返回匹配项 - 未导入订单。 但是,如果缺少任何字符串,则不应返回匹配

[lab stef]

3 个答案:

答案 0 :(得分: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检查整个字符串是否与我们的正则表达式匹配,因此我们需要以某种方式迭代整个字符串。

答案 1 :(得分: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?

     

“为什么你能做到这么简单?”

这就是我在这种情况下对正则表达式的看法。

答案 2 :(得分: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

我认为这是一种矫枉过正。另一个优化的解决方案会更好。