获取正则表达式匹配后的文本
Posted
技术标签:
【中文标题】获取正则表达式匹配后的文本【英文标题】:Getting the text that follows after the regex match 【发布时间】:2011-06-27 18:17:39 【问题描述】:我是使用 Regex 的新手,我已经浏览了很多教程,但我还没有找到适用于我想做的事情的教程,
我想搜索一些东西,但返回它后面的所有内容,而不是搜索字符串本身
例如“一些很棒的蹩脚句子”
搜索“句子”
return "太棒了"
任何帮助将不胜感激
到目前为止,这是我的正则表达式
sentence(.*)
但它返回:很棒的句子
Pattern pattern = Pattern.compile("sentence(.*)");
Matcher matcher = pattern.matcher("some lame sentence that is awesome");
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 find the text");
【问题讨论】:
您的实际呼叫是什么?你在用Matcher
吗?
我正在使用匹配器和模式
...我们仍然希望查看您的实际 Java 代码以帮助评估问题所在。
System.out.println("I found the text: " + "some lame sentance that is aweomse".substring(end()));
@DavidIsNotHere 纳粹应该有一个大写 N...
【参考方案1】:
您只需在下面的行中输入“group(1)”而不是“group()”,返回值将是您所期望的:
System.out.println("I found the text: " + matcher.group(**1**).toString());
【讨论】:
【参考方案2】:您可以按照评论中的要求使用“仅正则表达式”来执行此操作:
(?<=sentence).*
(?<=sentence)
是一个positive lookbehind assertion。这匹配字符串中的某个位置,即文本sentence
之后的位置,而不使该文本本身成为匹配的一部分。因此,(?<=sentence).*
将匹配sentence
之后的任何文本。
这是正则表达式的一个很好的特性。但是,在 Java 中,这仅适用于有限长度的子表达式,即。 e. (?<=sentence|word|(foo)1,4)
是合法的,但 (?<=sentence\s*)
不是。
【讨论】:
您声明它不应包含肯定的后向断言。所以我假设“.*(? @user2184214:那是因为它是一个观察背后断言。.*
匹配任何文本,然后 (?<=...)
向后查找单词 sentence
,在这种情况下断言匹配以该单词结尾。如果您想在该单词之前停止,则需要向前看:.*(?=sentence)
将匹配后面跟有sentence
的任何文本。
对于任何想在一个或另一个字符串之后匹配任何文本的方法的人来说,像 (?<=sentence1|sentence2).*
、(?:(?<=sentence1)|(?<=sentence2)).*
甚至 (?:sentence1|sentence2)(.*)
这样的正则表达式可能会起作用。
非常感谢!我正在使用您的答案来查找加号后的所有内容。再举一个例子:(?<=\+).*
【参考方案3】:
如果Matcher是用str
初始化的,匹配后可以用
str.substring(matcher.end())
示例代码:
final String str = "Some lame sentence that is awesome";
final Matcher matcher = Pattern.compile("sentence").matcher(str);
if(matcher.find())
System.out.println(str.substring(matcher.end()).trim());
输出:
太棒了
【讨论】:
matcher.find()
在此之前是必需的,IMO。
@Nishant 这就是我写的:“赛后”。添加示例代码来说明【参考方案4】:
您的正则表达式"sentence(.*)"
是正确的。要检索括号中组的内容,您可以调用:
Pattern p = Pattern.compile( "sentence(.*)" );
Matcher m = p.matcher( "some lame sentence that is awesome" );
if ( m.find() )
String s = m.group(1); // " that is awesome"
注意在这种情况下使用m.find()
(尝试在字符串上的任何位置查找)而不是m.matches()
(由于前缀“有些蹩脚”而失败;在这种情况下,正则表达式需要为@987654325 @)
【讨论】:
谢谢,但如果我只想让它返回“太棒了”怎么办 在正则表达式末尾添加“(.*)”以提高性能可能是个坏主意...【参考方案5】:您需要使用匹配器的 group(int) - group(0) 是整个匹配项,group(1) 是您标记的第一个组。在您指定的示例中,group(1) 是“sentence”之后的内容。
【讨论】:
以上是关于获取正则表达式匹配后的文本的主要内容,如果未能解决你的问题,请参考以下文章
powershell Get-Matches()获取所有正则表达式匹配。回答问题“我如何遍历文本文件并打印每个林的所有匹配的正则表达式组