我想使用Java提取某些两个单词之间的子字符串。
例如:
This is an important example about regex for my work.
我想提取“ 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");
}
效果很好。
但是我想做另外两件事
如果句子是:This is an important example about regex for my work and for me.
我想提取到第一个“ for
”即important example about regex
有时我想将模式之间的单词数限制为3个单词,即 important example about
有什么想法吗?
对于第一个问题,请使其变得懒惰。您可以在问号后面加上一个问号,然后该问号将尽可能少地匹配。
(?<=an).*?(?=for)
我不知道最后的额外内容对不必要的内容有什么.
好处.*.
。
对于第二个问题,您必须定义什么是“单词”。我想在这里说的可能只是一个非空格序列,后面是一个空格。像这样
\S+\s
像这样重复3遍
(?<=an)\s(\S+\s){3}(?=for)
为确保整个单词的模式数学使用单词边界
(?<=\ban\b)\s(\S+\s){1,5}(?=\bfor\b)
看到它在线在这里Regexr
{3}
会精确匹配3个,最小为1个,最大为3个,这样做 {1,3}
替代方案:
正如dma_k在您的情况中正确指出的那样,不必使用后视和前瞻。请参阅此处关于分组的Matcher文档
您可以改用捕获组。只需将要提取的部分放在方括号中,它将被放入捕获组。
\ban\b(.*?)\bfor\b
看到它在线在这里Regexr
您可以像这样访问该组
System.out.println("I found the text: " + matcher.group(1).toString());
^
您只有一对方括号,因此简单易用,只需将其1
放入matcher.group(1)
即可访问第一个捕获组。
问题内容: 我一直在尝试找出如何在两个特殊字符’和’之间提取字符串的一部分,我一直在研究regex,但坦率地说,我无法理解它 。Java代码示例: 我想拔出89 通常,我只想知道如何在两个特定字符之间提取字符串的一部分。 另外,很高兴知道如何从一开始就将字符串的一部分提取到特定字符,例如21。 问题答案: 试试这个正则表达式: 作为Java字符串文字,您将必须编写如下: 这是一个更完整的示例,演示
问题内容: 我尝试获取<%=和%>之间的字符串,这是我的实现: 它返回 但我的期望是: 我在哪里错了以及如何纠正它? 问题答案: 您的模式很好。但是,您不应该轻信它,应该这样做。以下代码提供了您正在寻找的输出:
问题内容: 我试图从一个较大的字符串中提取一个字符串,使它在’:’和’;’之间得到一切。 当前 期望的输出 问题答案: 你可以试试这个
问题内容: 我有一个像 “ ABC [这是为了提取]” 我想提取Java中的部分。我正在尝试使用split,但是它不能按我想要的方式工作。有人有建议吗? 问题答案: 如果您的字符串中只有一对方括号(),则可以使用:
问题内容: 我有一个字符串,例如:“这是应该使用的URL http://www.google.com/MyDoc.pdf ” 我只需要提取从http开始并以pdf结尾的URL:http: //www.google.com/MyDoc.pdf 这使我的输出为“应使用的http://www.google.com/MyDoc.pdf” 需要帮助。 问题答案: 这种问题是针对正则表达式进行的: 正则表达式