我想获取包含一个目标词的字符串的一部分。例如,从以下示例字符串:
...
def a:
...
target1
...
def b:
...
def c:
...
我想得到这个部分:
def a:
...
target1
...
这是我的Java代码:
s = "(def\\W(.*)\\W(target1|target2|target3)\\W(.*)def\\W)";
Pattern p = Pattern.compile(s);
Matcher m = p.matcher(sourceString);
while(m.find()){
System.out.println(m.group(0));
}
问题在于它没有找到任何东西。
非常感谢你的帮助!
答案 0 :(得分:1)
默认情况下,.
表示期望行分隔符的任何字符。要使点接受所有字符添加Pattern.DOTALL
标记。
Pattern p = Pattern.compile(s,Pattern.DOTALL);
您可能还想.*
对.*?
感到不情愿。
您可以使用正则表达式
String s = "(def\\W(.*?)\\W(target1|target2|target3)\\W(.*?))def\\W";
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - group 1
和内部循环使用m.group(1)
代替m.group(0)
答案 1 :(得分:1)
您可以使用:
Pattern p = Pattern.compile(
"(\\bdef\\s((?!\\bdef\\b).)*?\\b(?:target1|target2|target3)\\b.*?(?=sdef))",
Pattern.DOTALL);
答案 2 :(得分:1)
尝试这样的事情 -
# "(?ms)^def\\b(?:(?!^def\\b).)*?\\b(target[123])\\b(?:(?!^def\\b).)*"
(?ms) # Multi-line and Dot-all modes
^ def \b # 'def'
(?:
(?! ^ def \b ) # Not 'def'
.
)*?
\b
( target [123] ) # (1), 'target 1 or 2 or 3
\b
(?:
(?! ^ def \b ) # Not 'def'
.
)*
输出:
** Grp 0 - ( pos 0 , len 27 )
def a:
...
target1
...
** Grp 1 - ( pos 13 , len 7 )
target1