是否可以在Java中编写与单词部分匹配的正则表达式?例如,我想搜索字符串'ab','cd'和'ef'。应在以下示例中返回匹配项:
[lab stef ecde], [lecde effe aaaab]
因此,如果所有字符串('ab','cd','ef')都是文本中任何位置的单词部分,则应返回匹配项 - 未导入订单。 但是,如果缺少任何字符串,则不应返回匹配
[lab stef]
答案 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
我认为这是一种矫枉过正。另一个优化的解决方案会更好。