使用正则表达式匹配第二个子字符串

时间:2013-03-13 06:10:24

标签: java regex

我需要一个与"abc"中的第二个"abcasdabchjkabc"匹配的正则表达式。 我尝试编写这样的代码,

Pattern p = Pattern.compile("(?<=abc(.*?))abc");

但它会抛出java.util.regex.PatternSyntaxException

Look-behind group does not have an obvious maximum length near index 11
(?<=abc(.*?))abc
           ^
    at java.util.regex.Pattern.error(Pattern.java:1713)
    at java.util.regex.Pattern.group0(Pattern.java:2488)
    at java.util.regex.Pattern.sequence(Pattern.java:1806)
    at java.util.regex.Pattern.expr(Pattern.java:1752)
    at java.util.regex.Pattern.compile(Pattern.java:1460)
    at java.util.regex.Pattern.<init>(Pattern.java:1133)
    at java.util.regex.Pattern.compile(Pattern.java:823)

请告诉我合适的人!

3 个答案:

答案 0 :(得分:5)

您不能在后面的断言中使用*+

你真的想要匹配两个abc之间的所有内容吗?

Pattern.compile("abc(.*?)abc");

或者您只是想检查两个abc

Pattern.compile("abc.*?abc");

在任何一种情况下,我都没有看到需要 for lookbehind。

答案 1 :(得分:1)

我想你想要这样的东西:

java.util.regex.Pattern.compile("(?<=abc.{1,99})abc");

找到第二个abc。

答案 2 :(得分:1)

一个简单的选项是匹配您的模式两次

String input = "abcXYabcZRabc";

Pattern p = Pattern.compile("abc");
Matcher m = p.matcher(input);

m.find(); // what to do when there is no match?
m.find(); // what to do when there is only one match?

System.out.println("Second match is between " + m.start() + " and " + m.end());

工作示例:http://ideone.com/uVZL3j