Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取字符串的一部分的Java正则表达式_Java_Regex - Fatal编程技术网

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

获取字符串的一部分的Java正则表达式,java,regex,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(so

我想得到字符串的一部分,其中包含一个目标单词。例如,从以下示例字符串:

...
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));
}
问题是它没有发现任何东西


非常感谢你的帮助

默认情况下
表示除行分隔符以外的任何字符。要使点接受所有字符,请添加
模式.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)
您可以使用:

Pattern p = Pattern.compile(
  "(\\bdef\\s((?!\\bdef\\b).)*?\\b(?:target1|target2|target3)\\b.*?(?=sdef))",
  Pattern.DOTALL);

试试这样的方法-

 #  "(?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  

你的问题呢?到目前为止,你的代码有什么问题?@tnw现在代码没有打印任何内容。@Ryan。。我不确定这是否适用于您,但您可以尝试类似“(def.*(target1 | target2 | target3))的方法吗?您是否正在尝试从一个def到下一个def查找目标?我想这意味着两者之间没有def,对吧?谢谢!我在你的解决方案上取得了一些进展。现在,还有一个问题。“def”现在被映射多次。为什么我可以限制“def”只出现两次?非常感谢。看起来不错,现在只有一个问题。如果输入如下,则映射多个“def”。。。定义b:。。。定义a:。。。目标1。。。定义b:。。。def c:。。。