0

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

[lab stef ecde], [lecde effe aaaab]

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

[lab stef]
4

3 回答 3

6

如果它不必是正则表达式,那么Tichodroma 的答案就是您要寻找的答案。

但是,如果您真的需要使您的生活复杂化并使用正则表达式,您可以尝试使用环顾机制,例如向前看并创建类似的东西

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

更清楚地解释它:在

(?=.*ab)(?=.*cd)(?=.*ef).*
  • (?=.*ab)将检查您的字符串是否包含.*abwhere.*将匹配ab部分之前的任何字符。
  • 前瞻 (?=...) 也是零宽度,这意味着它将光标重置到前瞻开始之前的位置,所以在我们的例子中,它仍然位于字符串的开头
  • 这样我们可以再次(?=.*cd)使用(?=.*ef)
  • 但我们还需要在.*最后包含在我们的正则表达式中,因为matches检查整个字符串是否与我们的正则表达式匹配,所以我们需要以某种方式迭代整个字符串。
于 2013-07-04T13:45:30.330 回答
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?

“既然可以做得很复杂,为什么要简单呢?”

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

于 2013-07-04T13:34:28.810 回答
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

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

于 2013-07-04T13:50:18.480 回答