Dart 正则表达式去除电话号码中的空格

3
我尝试了所有的正则表达式解决方案,但没有匹配成功。REGEX Remove Space 我使用Dart和Flutter,尝试仅捕获此类型字符串的数字部分:
情况1
     aaaaaaaaa 06 12 34 56 78  aaaaaa 

第二种情况

    aaaaaaaa 0612345678 aaaaaa 

第三种情况

   aaaaaa +336 12 34 56 78 aaaaa

我希望你只能获得10位数字,没有空格和+33。 如果是+33,则需要用0替换+33。当前我有这段代码\D*(\d+)\D*?,适用于第2种情况。

你为什么选择尝试\D*(\d+)\D*?它不能匹配用空格分隔的数字。这个模式的规则是什么?是字符串中的第一个数字/空格块吗? - Wiktor Stribiżew
抱歉,目前 (\d+) 已足够匹配 aaaaaaaa 0612345678 aaaaaa,结果为 0612345678。但是如果数字之间有空格,此代码将无法工作,例如 06 12 34 56 78。 - Nitneuq
1个回答

4
您可以匹配并捕获可选的+33,然后是一个数字,接着是空格或数字,然后检查第1组是否匹配,然后相应地构建结果。
以下是一个示例解决方案(已测试):
var strs = ['aaaaaaaaa 06 12 34 56 78  aaaaaa', 'aaaaaaaa 0612345678 aaaaaa', 'aaaaaa +336 12 34 56 78 aaaaa', 'more +33 6 12 34 56 78'];
  for (int i = 0; i < strs.length; i++) {
    var rx = new RegExp(r"(?:^|\D)(\+33)?\s*(\d[\d ]*)(?!\d)");
    var match = rx.firstMatch(strs[i]);
    var result = "";
    if (match != null) {
      if (match.group(1) != null) {
        result = "0" + match.group(2).replaceAll(" ", "");
      } else {
        result = match.group(2).replaceAll(" ", "");
      }
      print(result);
  }
}

在输出中返回3个0612345678字符串。
模式为:
(?:^|\D)(\+33)?\s*(\d[\d ]*)(?!\d)

请查看此处的演示

  • (?:^|\D) - 开始于字符串或任何非数字字符
  • (\+33)? - 第1组捕获+33 0或1次
  • \s* - 任意0个或多个空格
  • (\d[\d ]*) - 第2组: 数字后面跟着空格或者数字
  • (?!\d) - 不允许立即在右边匹配数字。

第2组的空格会被使用match.group(2).replaceAll(" ", "")去除,因为不能对一个匹配操作中的不连续字符串进行匹配。


抱歉,我有另一个案例...使用+33 6 12 34 56 78,它返回33612345678。 - Nitneuq
它可以使用正则表达式(r"(?:^|\D)(+33)?\s?(\d[\d ]*)(?!\d)")。 - Nitneuq
@QuentinGuichot 对的,你也可以使用\s*来匹配0个或多个空格,而不是\s?只匹配1个或0个空格。我已经更新了答案以考虑到这种情况。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接