使用java中的regex在两个特定单词之间提取子字符串

Dai*_*isy 10 java regex

我想用java提取某些两个单词之间的子字符串.

例如:

This is an important example about regex for my work.
Run Code Online (Sandbox Code Playgroud)

我想提取" an"和" for" 之间的所有内容.

到目前为止我所做的是:

String sentence = "This is an important example about regex for my work and for me";
Pattern pattern = Pattern.compile("(?<=an).*.(?=for)");
Matcher matcher = pattern.matcher(sentence);

boolean found = false;
while (matcher.find()) {
    System.out.println("I found the text: " + matcher.group().toString());
    found = true;
}
if (!found) {
    System.out.println("I didn't found the text");
}
Run Code Online (Sandbox Code Playgroud)

它运作良好.

但是我想再做两件事

  1. 如果句子是:This is an important example about regex for my work and for me. 我想提取到第一个" for"即important example about regex

  2. 有时我想将模式之间的单词数限制为3个单词即ie important example about

有什么想法吗?

ste*_*ema 8

对于你的第一个问题,让它变得懒惰.您可以在量词之后加上一个问号,然后量词将尽可能地匹配.

(?<=an).*?(?=for)
Run Code Online (Sandbox Code Playgroud)

我不知道最后的附加内容.对于.*.其不必要的内容是有益的.

对于第二个问题,您必须定义"单词"是什么.我想在这里可能只是一个非空格序列,后跟一个空格.像这样的东西

\S+\s
Run Code Online (Sandbox Code Playgroud)

并像这样重复这3次

(?<=an)\s(\S+\s){3}(?=for)
Run Code Online (Sandbox Code Playgroud)

确保整个单词的模式数学使用单词边界

(?<=\ban\b)\s(\S+\s){1,5}(?=\bfor\b)
Run Code Online (Sandbox Code Playgroud)

看到它在线在这里Regexr

{3} 将精确匹配3,最少为1,最多为3 {1,3}

替代方案:

正如dma_k在你的案例中正确陈述的那样,没有必要使用后面的观察并向前看.请参阅此处有关组的Matcher文档

您可以改为使用捕获组.只需将要提取的部分放在括号中,它就会被放入捕获组中.

\ban\b(.*?)\bfor\b
Run Code Online (Sandbox Code Playgroud)

看到它在线在这里Regexr

你可以像这样访问这个组

System.out.println("I found the text: " + matcher.group(1).toString());
                                                        ^
Run Code Online (Sandbox Code Playgroud)

你只有一对括号的,所以它的简单,只是把1matcher.group(1)访问第一个捕获组.