我想用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)
它运作良好.
但是我想再做两件事
如果句子是:This is an important example about regex for my work and for me.
我想提取到第一个" for
"即important example about regex
有时我想将模式之间的单词数限制为3个单词即ie important example about
有什么想法吗?
对于你的第一个问题,让它变得懒惰.您可以在量词之后加上一个问号,然后量词将尽可能地匹配.
(?<=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)
你只有一对括号的,所以它的简单,只是把1
到matcher.group(1)
访问第一个捕获组.