1

我有一个像这样的字符串:

“嘿,我是 Peter,我是一名软件工程师。我了解 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));

当我运行时,我得到一个异常,上面写着“未找到匹配项”。

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

4

3 回答 3

5

我假设您的字符串中有一个换行符要匹配,例如:

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

但我不能确切地告诉你为什么。

于 2013-07-10T13:19:38.453 回答
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 的参数也不正确]

于 2013-07-10T11:55:57.053 回答
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");

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

于 2013-07-10T13:29:44.130 回答