【问题标题】:Regex: Word bounary before plus-sign正则表达式:加号之前的单词边界
【发布时间】:2018-03-19 11:00:14
【问题描述】:

我正在使用 C# 并希望从字符串中解析电话号码。我住在瑞士,电话号码可以有 10 位数字,如下所示: 000 000 00 00 或可以以+41 开头:+41 00 000 00 00。我写了以下正则表达式:

var phone = new Regex(@"\b(\+41\s\d{2}|\d{3})\s?\d{3}\s?\d{2}\s?\d{2}\b");

这在第一个示例中非常有效,但带有“+41”的示例不匹配。我很确定单词边界\b 和以下+ 存在问题。当我在开始时删除\b 时,它会发现与+41-example 匹配。我的代码:

    var phone = new Regex(@"\b(\+41\s\d{2}|\d{3})\s?\d{3}\s?\d{2}\s?\d{2}\b");

    var text = @"My first phonenumber is: +41 00 000 00 00. My second one is:
    000 000 00 00. End.";

    var phoneMatches = phone.Matches(text);
    foreach(var match in phoneMatches)
    {
        Console.WriteLine(match);
    }
    Console.ReadKey();

输出:000 000 00 00

没有\b的输出:

+41 00 000 00 00 000 000 00 00

有什么解决办法吗?

【问题讨论】:

  • 如果下一个预期的字符可以是非单词字符,请不要使用\b。使用(?<!\w)
  • @WiktorStribiżew 成功了,谢谢。我从未在正则表达式中见过(?<! ......你能解释一下这些是什么意思吗?我在网上找不到任何参考资料。

标签: c# .net regex phone-number word-boundary


【解决方案1】:

您可以使用(?<!\w) positive lookbehind 而不是第一个\b。由于下一个预期字符可以是非单词 char,因此单词边界可能会匹配失败,而 (?<!\w) 只会在下一个预期字符之前有一个单词 char 时才会匹配失败。

使用

var phone = new Regex(@"(?<!\w)(\+41\s\d{2}|\d{3})\s?\d{3}\s?\d{2}\s?\d{2}\b");
                        ^^^^^^^

详情

  • (?&lt;!\w) - 如果在当前位置的左边有一个单词 char 则匹配失败
  • (\+41\s\d{2}|\d{3}) - +41,一个空格和 2 位或 3 位
  • \s? - 1 或 0 个空格
  • \d{3} - 3 位数
  • \s? - 1 或 0 个空格
  • \d{2} - 2 位数字
  • \s? - 1 或 0 个空格
  • \d{2} - 2 位数字
  • \b - 一个单词边界(这个可以工作,因为之前预期的字符是一个数字)。

注意:要仅匹配 ASCII 数字,您可能需要将 \d 替换为 [0-9](请参阅 this thread)。

【讨论】:

    【解决方案2】:

    试试这个one:

    (\+\b41\s\d{2}|\b\d{3})\s?\d{3}\s?\d{2}\s?\d{2}\b
    

    移动 () 块内的边界分隔符,并将 + 放在单词边界分隔符之前。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 2011-04-14
      • 2011-03-28
      • 2012-09-24
      相关资源
      最近更新 更多