在具有换行符的字符串中的两个单词之间提取

时间:2013-07-10 11:50:03

标签: java regex

我有一个像:

的字符串

“嘿,我是彼得,我是一名软件工程师。我知道Java,我是RegEx的新手。”

我想从“彼得到新人”中提取所有人物。

来自gskinner.com/RegExr/我可以看到这种模式有效 - (?< = Hey)([^ \ n] *)(?= Reg)

但在Java中,它不起作用。任何人都可以帮忙吗?在Java中需要做些什么?

我的代码如下所示:

    Pattern p = Pattern.compile("(?<=Hey)([^\n]*)(?=Reg)");
    Matcher m = p.matcher(p);
    m.find();
    System.out.println(m.group(0));

当我跑步时,我得到一个异常,上面写着“找不到匹配”。

  

线程“main”中的异常java.lang.IllegalStateException:找不到匹配项       在java.util.regex.Matcher.group(Matcher.java:485)

3 个答案:

答案 0 :(得分:4)

我假设你的字符串中有一个新行匹配,比如:

String stringWithPeter = "Hey I am Peter I work as a Software Engineer." +
    System.getProperty("line.separator") + "I know Java and I am new to RegEx";

你希望在这个换行符中匹配。您可以告诉Java在匹配点(“。”)时包含换行符:

Pattern p = Pattern.compile("(?<=Hey)(.*)(?=Reg)", Pattern.DOTALL);

然后你会得到你正在寻找的行为。我还发现,当这个有效时:

String stringWithPeter = "Hey I am Peter I work as a Software Engineer.\nI know Java and I am new to RegEx";
Pattern p = Pattern.compile("(?<=Hey)([^\r]*)(?=Reg)");

但我完全不能告诉你原因。

答案 1 :(得分:1)

您在表达式中留下了未转义的\n,它将作为换行符放入字符串中。

尝试:

    Pattern p = Pattern.compile("(?<=Hey)([^\\n]*)(?=Reg)");
    Matcher m = p.matcher(stringToMatch);
    m.find();
    System.out.println(m.group(0));

代替。

[还要注意用户Explosion Pills注意到p.matcher的参数也不正确]

答案 2 :(得分:0)

您可以在一行中完成所有操作:

String middle = str.replaceAll(".*(?<=Hey)([^\n]*)(?=Reg).*", "$1");

这是一个测试:

String str = "Hey I am Peter I work as a Software Engineer. I know Java and I am new to RegEx";
String middle = str.replaceAll(".*(?<=Hey)([^\n]*)(?=Reg).*", "$1");
System.out.println(middle);

输出:

I am Peter I work as a Software Engineer. I know Java and I am new to 

请注意,使用此正则表达式获得相同的结果

String middle = str.replaceAll(".*(?<=Hey)(.*)(?=Reg).*", "$1");

你的正则表达式正在寻找一串字符,所有字符都是不是换行符。