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

时间:2018-03-19 11:00:15

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

我正在使用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");

这与第一个例子完全吻合,但是#34; + 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

任何解决方案?

2 个答案:

答案 0 :(得分:2)

您可以使用(?<!\w) positive lookbehind代替第一个\b。由于下一个预期字符可以是非字符字符,因此字边界可能会使匹配失败,(?<!\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)。

答案 1 :(得分:-1)

试试这个one

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

在()块内移动边界分隔符,并在字边界分隔符之前放置+。