Java正则表达式获取字符串的一部分

时间:2015-07-23 16:05:43

标签: java regex

我想获取包含一个目标词的字符串的一部分。例如,从以下示例字符串:

...
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));
}

问题在于它没有找到任何东西。

非常感谢你的帮助!

3 个答案:

答案 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);

RegEx Demo

答案 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