如何使用正则表达式从字符串中获取精确的 8 位数字?

Aij*_*han 2 c# regex

我的要求是从给予者字符串中获得精确的 8 位数字。

让我给你举个例子。

  1. 000012345678000 : 这是不允许的,因为它有超过 8 位数字。所以不应提取“12345678”

  2. 0000 12345678 000:这是允许的,因为 8 位是分开的。

  3. 0000 12345678. ABCKSAKU:这是允许的。
  4. 0000.12345678.ABCKSAKU:这是允许的。
  5. 0000/12345678/ABCKSAKU:这是允许的。

简而言之,允许使用单独的 8 位数字。不应该在任何数字之内。

我试过了。

\s{1,}\d{8}\s{1,}但只允许 8 位数字,两边有空格。

你能帮我么。提前致谢

Wik*_*żew 5

\s{1,}\d{8}\s{1,}模式确实仅在空格之间匹配,因为\s{1,}(等于\s+)匹配 1 个或多个空格字符。

您可以使用环视来匹配未包含在其他数字中的数字序列:

(?<!\d)\d{8}(?!\d)
Run Code Online (Sandbox Code Playgroud)

查看正则表达式演示

图案详情

  • (?<!\d) - 如果当前位置左侧有一个数字,则匹配失败的负向后视
  • \d{8} - 8 位数字
  • (?!\d)- 如果当前位置右侧有一个数字,则匹配失败的负前瞻。

在 C# 中,使用以下代码获取所有匹配项:

var results = Regex.Matches(s, @"(?<!\d)\d{8}(?!\d)", RegexOptions.ECMAScript)
    .Cast<Match>()
    .Select(m => m.Value)
    .ToList();
Run Code Online (Sandbox Code Playgroud)

请注意,该RegexOptions.ECMAScript选项\d只会匹配 ASCII 数字。

词边界注意:您可以考虑词边界\b而不是环顾,但有一个问题。如果需要从_12345678_字符串中提取 8 位数字,则不能使用\b\d{8}\b模式。如果您希望此匹配失败,您可以使用\b\d{8}\b.