正则表达式:加号之前的单词边界

Regex: Word bounary before plus-sign

我正在使用 C# 并希望从字符串中解析 phone 数字。我住在瑞士,phone 号码可以有 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 示例的匹配项。我的代码:

    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

有什么解决办法吗?

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

使用

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

详情

  • (?<!\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)。

试试这个 one:

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

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