1

以下正则表达式在 Eclipse 的查找对话框中工作,但在 Java 中引发异常。

我找不到原因

(?<=(00|\\+))?[\\d]{1}[\\d]*

执行时出现语法错误:

Pattern.compile("(?<=(00|\\+))?[\\d]{1}[\\d]*")

在我使用的查找中

(?<=(00|\+))?[\d]{1}[\d]*

我想匹配带有或不带有 + 或 00 的电话号码。但这不是重点,因为我在位置 13 处遇到语法错误。如果我去掉第二个“?”,我不会收到错误消息。

Pattern.compile("(?<=(00|\\+))[\\d]{1}[\\d]*")

请考虑,有时我需要使用更大的数字而不是 1,无论如何问题是关于语法错误

4

3 回答 3

1

如果您的数据看起来像00ddddd+dddddd 是数字,那么您想获得@Bergi的正则表达式(?<=00|\\+)\\d+就可以了。但是,如果您的数据有时没有任何您想忽略的部分,ddddd那么您可能应该使用组机制,例如

String[] data={"+123456","00123456","123456"};
Pattern p=Pattern.compile("(?:00|\\+)?(\\d+)");
Matcher m=null;
for (String s:data){
    m=p.matcher(s);
    if(m.find())
        System.out.println(m.group(1));
}

输出

123456
123456
123456
于 2012-07-12T12:27:18.117 回答
0

您可能会大大缩短您的正则表达式。当内部只有一个类时不需要字符类 - 只需使用\d. 而且{1}也很没用。此外,您可以+用于匹配“一个或多个”(它是 的缩写{1,})。接下来,不需要在您的lookbehind 中进行额外的分组。

最后,为什么lookbehind 是可选的(带有?)?如果你不需要它,就把它放在一边。这甚至可能是您的模式语法错误的来源 - 环顾不能是可选的。

试试这个:

/(?<=00|\+)\d+/

爪哇:

"(?<=00|\\+)\\d+"
于 2012-07-12T12:08:31.123 回答
0

这是一个对我有用的例子:

public static void main(String[] args) {
        Pattern pattern = Pattern.compile("(?<=00|\\+)(\\d+)");
        Matcher matcher = pattern.matcher("+1123456");
        if (matcher.find()) {
            System.out.println(matcher.group(1));
        }
    }
于 2012-07-12T12:37:47.943 回答