具有混合字符集的正则表达式和每个的不同计数

时间:2017-06-19 10:40:59

标签: c# regex

我试图用正则表达式找到一个固定长度的数字。问题是,在某些情况下,数字被分成由空格或破折号划分的部分。例如:

  • 123456789
  • 123 456 789
  • 12 34567 89
  • 123-456-789
  • 12-345678-9

我想你明白我的意思。目前正在使用的正则表达式只能得到第一个数字:

(?<=^|\D)([0-9]{9})(?=$|\D)

当我在我的角色列表中添加空格和破折号时:

(?<=^|\D)([0-9 -]{9})(?=$|\D)

我仍然没有得到预期的结果,因为&#34;数字&#34;包含它们超过9个字符。如果我拿出更多的字符,我最终会得到很多错误的结果。

我需要的是一种告诉正则表达式采用数字,空格和破折号的方法,但有以下限制:

  • 该数字只能是9个字符(不含空格和短划线)
  • 没有两个空格或短划线或它们的混合应该连续

此外,如果不会返回破折号和空格会很好,但那并不重要

2 个答案:

答案 0 :(得分:1)

我建议使用

(?<!\d)\d(?:[ -]?\d){8}(?!\d)

请参阅regex demo。要仅匹配ASCII数字,请将RegexOptions.ECMAScript选项传递给正则表达式构造函数。

模式详情

  • (?<!\d) - 如果当前位置的左侧有一个数字符号(与(?<=^|\D)相同),则会导致匹配失败的负面反馈(注意:to避免匹配234.123 4567-89(?<!\d\.?)
  • 替换此lookbehind
  • \d - 数字
  • (?:[ -]?\d){8} - 恰好出现8次空格或-,然后是任意数字
  • (?!\d) - 如果当前位置右侧有一个数字(注意:为了防止匹配123456789.34),则匹配失败的否定前瞻,使用{ {1}}代替)。

用于提取匹配项的C#用法:

(?!\.?\d)

答案 1 :(得分:1)

这个正则表达式有效:

(\d\s?-?){9}

它正在寻找9组任意数字,后跟可选的空格和可选的连字符。

因此它会匹配您的所有示例,但也会匹配以下内容:

  • 1 2 3 4 5 6 7 8 9
  • 1 -2 -3 -4 -5 -6 -7 -8 -9 -

它是一个简单的正则表达式,但如果要排除带有尾随空格或连字符的匹配项,则可能无法满足您的要求。 Wiktor Stribiżew的答案提供了更复杂的正则表达式,可以更彻底地满足您的需求。