gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:16:53 24 4
gpt4 key购买 nike

我正在使用 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 示例的匹配项。我的代码:

    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 .由于下一个预期字符可以是非单词字符,单词边界可能无法匹配,并且 (?<!\w)只有在下一个预期字符之前有一个单词字符时,匹配才会失败。

使用

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)。

关于c# - 正则表达式:加号之前的单词边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49361356/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com