我正在使用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
任何解决方案?
答案 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)