是否可以在 Java 中编写匹配单词部分的正则表达式?例如,我想搜索字符串“ab”、“cd”和“ef”。在以下示例中应返回匹配项:
[lab stef ecde], [lecde effe aaaab]
因此,如果所有字符串('ab'、'cd'、'ef')都是文本中任何位置的单词的一部分,则应返回匹配项 - 不导入顺序。但是,如果缺少任何字符串,则不应返回匹配项
[lab stef]
如果它不必是正则表达式,那么Tichodroma 的答案就是您要寻找的答案。
但是,如果您真的需要使您的生活复杂化并使用正则表达式,您可以尝试使用环顾机制,例如向前看并创建类似的东西
"lab stef ecde".matches("(?=.*ab)(?=.*cd)(?=.*ef).*") //true
"lab stef".matches("(?=.*ab)(?=.*cd)(?=.*ef).*") //false
更清楚地解释它:在
(?=.*ab)(?=.*cd)(?=.*ef).*
(?=.*ab)
将检查您的字符串是否包含.*ab
where.*
将匹配ab
部分之前的任何字符。(?=.*cd)
使用(?=.*ef)
.*
最后包含在我们的正则表达式中,因为matches
检查整个字符串是否与我们的正则表达式匹配,所以我们需要以某种方式迭代整个字符串。查找输入中的每个子字符串和&&
结果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?
“既然可以做得很复杂,为什么要简单呢?”
这就是我在这种情况下对正则表达式的看法。
这将做:
^.*(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
我相信这是一个矫枉过正。另一个优化的解决方案会更好。