【问题标题】:Match regex but only replace the first section - Java匹配正则表达式但仅替换第一部分 - Java
【发布时间】:2015-08-23 21:44:31
【问题描述】:

我正在尝试使用格式为 +44 或 +4 后跟任意数量的数字或连字符的电话号码,并将 +44 或 +4 替换为 +44 或 +4 后跟空间。

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

^[+]\d[0-9](?:([0-9]+))?

与数字匹配(不带连字符),但我认为前瞻只会匹配数字而不捕获额外的数字,但它似乎捕获了整个内容。

谁能指出我做错了什么的正确方向?

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

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

谢谢。

【问题讨论】:

  • 您没有答案所需要的可靠前提或规则。这就是为什么它不适合你。
  • 您不需要使用matches,如果replaceFirst 找不到匹配项,则会返回初始字符串。您只需要 1 个正则表达式即可替换:String num = Pattern.compile("^([+]\\d\\d?)([\\d-]*)$").matcher(title).replaceFirst("$1 $2");.

标签: java android regex


【解决方案1】:

如果你想匹配整数,但只替换它的一部分,你不应该使用积极的前瞻,而只是 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 不应该返回任何东西。

【讨论】:

  • 感谢您的回复。然而,虽然它匹配前缀它不匹配整数,因此在 java 中使用该 pattern.matcher("+441234567890").matches 返回 false。我需要匹配整个数字,但只捕获 +44.. 或者我应该使用一个正则表达式匹配,一个正则表达式替换前缀?
  • @crazyfool 所以你想捕获前缀和其余数字?
  • 我想匹配整个数字,但只捕获前缀。我已经编辑了我最初的问题,以准确显示我想要做什么,如果不太清楚,请道歉。
  • 正是我所追求的......也感谢你的解释,非常感谢:)
  • @m.cekiera 很好的解释。正则表达式中“-”的原因是什么?你不能只用:“^(\+\d\d)([\d]+)吗?” ?
猜你喜欢
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多