正则表达式:加号之前的单词边界
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
移动 () 块内的边界分隔符并将 + 放在单词边界分隔符之前。
我正在使用 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
移动 () 块内的边界分隔符并将 + 放在单词边界分隔符之前。