匹配正则表达式,但只替换第一部分 - Java

时间:2015-08-23 21:44:31

标签: java android regex

我试图取一个电话号码,其格式为+44或+4后跟任意数字的数字或连字符,然后用+44或+4替换+44或+4通过空间。

我相信我需要环顾四周以匹配完整的数字,但只能替换初始前缀,我尝试atm的是

Pattern pattern = Pattern.compile("^[+]\\d[0-9](?:([0-9]+))?");
if(pattern.matcher("+441234567890").matches())
                String  num = pattern.matcher(title).replaceFirst("$0 $1");

匹配数字(没有连字符)但是我认为前瞻只会匹配数字并且不会捕获额外的数字但是它似乎捕获了整个数字。

有人能指出我做错了什么吗?

编辑: 为了更清楚我的Java代码是

{{1}}

感谢。

1 个答案:

答案 0 :(得分:2)

如果你想匹配整数,但只替换它的一部分,你不应该使用积极的前瞻,而应该只是gruping,如:

(^\+\d\d)([\d-]+)?

前缀将在组1中,而其余的数字在组2中,因此要在这些部分之间添加空格,只需使用类似group1 + space + group2的内容。 在您的示例中,它应如下所示:

Pattern pattern = Pattern.compile("(^\\+\\d\\d)([\\d-]+)?");
if(pattern.matcher("+441234567890").matches()) {
    num = pattern.matcher(title).replaceFirst("$1 $2");
}

但是这个正则表达式总是会在前缀中捕获两位数,如果你想匹配+44或+4你应该使用:

(^\+(44|4))([\d-]+)?

所以如果你有更多可能的前缀,你也需要改变这个正则表达式。

你的正则表达式并没有像预期的那样工作,因为(?:([0-9]+))?是一个非捕获组,因此没有捕获与正则表达式的这部分相匹配的片段,但它仍然与整个正则表达式相匹配。所以$0返回了整个正则表达式,$1不应返回任何内容。