获取正则表达式匹配后的文本

时间:2011-02-15 16:52:45

标签: java regex

我是新手使用正则表达式,我一直在经历一些教程,但我找不到适用于我想做的事情,

我想搜索某些内容,但返回其后的所有内容,但不返回搜索字符串本身

e.g。 “一些蹩脚的句子很棒

搜索“句子

返回“太棒了

非常感谢任何帮助

到目前为止这是我的正则表达式

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");
}

5 个答案:

答案 0 :(得分:85)

您可以使用“只是正则表达式”执行此操作,如您在评论中所要求的那样:

(?<=sentence).*

(?<=sentence)positive lookbehind assertion。这匹配在字符串中的某个位置,即在文本sentence之后的位置,而不使该文本本身成为匹配的一部分。因此,(?<=sentence).*将匹配sentence之后的任何文字。

这是正则表达式的一个很好的功能。但是,在Java中,这只适用于有限长度的子表达式,即。即(?<=sentence|word|(foo){1,4})是合法的,但(?<=sentence\s*)不合法。

答案 1 :(得分:16)

你的正则表达式"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()(由于前缀“some lame”会失败;在这种情况下,正则表达式需要是".*sentence(.*)"

答案 2 :(得分:8)

如果使用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());
}

<强>输出:

  

太棒了

答案 3 :(得分:1)

您需要使用匹配器的组(int) - 组(0)是整个匹配,组(1)是您标记的第一个组。在您指定的示例中,group(1)是“ sentence ”之后的内容。

答案 4 :(得分:1)

您只需在下一行中输入“group(1)”而不是“group()”,并且返回将是您所期望的:

System.out.println("I found the text: " + matcher.group(**1**).toString());