获取字符串的一部分的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:。。。