【发布时间】:2017-04-03 21:53:24
【问题描述】:
我正在使用 Java 正则表达式,我需要匹配两个单词,但是这些单词之间可以出现一个空格或另一个单词,例如“电力能源”,“能源的力量”,“能源的力量”。我必须获得“能量”的所有变化。有可能吗?
此外,我需要有类似“pow* ener*”的东西来捕捉所有以 con pow 和 ener 开头的双字。例如“能量的力量”。
【问题讨论】:
我正在使用 Java 正则表达式,我需要匹配两个单词,但是这些单词之间可以出现一个空格或另一个单词,例如“电力能源”,“能源的力量”,“能源的力量”。我必须获得“能量”的所有变化。有可能吗?
此外,我需要有类似“pow* ener*”的东西来捕捉所有以 con pow 和 ener 开头的双字。例如“能量的力量”。
【问题讨论】:
在模式中的两个单词之间使用简单的wild card:
"power(.*?)energy" 或只是"power.*energy"
【讨论】:
试试这个:
/(?=power)(?=energy)/i
【讨论】:
以下
Pattern pattern = Pattern.compile("(\\bpow\\w+)(.*?)(\\bener\\w+)");
Matcher matcher = pattern.matcher("Test powers test energies test.");
if(matcher.find()) {
System.out.println(matcher.group());
}
打印powers test energies。它应该与您发布的其他变体一起使用。显然,如果单词以 pow 开头,它会给您带来误报,但这似乎是您在问题中想要的。
【讨论】:
你可以试试这个模式:
\\bpowers?\\s+(?:\\w+\\s+){0,2}energ(?:y|ies)\\b
注意:如果您愿意,可以在“power”和“energy”之间允许两个以上的词增加(或减少)大括号内的量词值。
\\b 是一个单词边界,以避免在单词之后或之前出现其他字母(或数字或下划线)。
【讨论】:
如果你需要捕捉单词“power”、“energy”和分组变化,你可以使用:
(pow\S+\b).*(ener\S+\b)
在java中:
Pattern pattern = Pattern.compile("(pow\\S+\\b).*(ener\\S+\\b)");
Matcher matcher = pattern.matcher("powers of energies");
if(matcher.find()) {
int count = matcher.groupCount();
for(int i=1;i<=count;i++){
System.out.println(matcher.group(i));
}
【讨论】:
(pow\S+)\s{0,1}\w*\s{0,1}(ener\S+)。这将匹配 power energies 和 power of energies 但不匹配 power of my energies