我试图用正则表达式找到一个固定长度的数字。问题是,在某些情况下,数字被分成由空格或破折号划分的部分。例如:
我想你明白我的意思。目前正在使用的正则表达式只能得到第一个数字:
(?<=^|\D)([0-9]{9})(?=$|\D)
当我在我的角色列表中添加空格和破折号时:
(?<=^|\D)([0-9 -]{9})(?=$|\D)
我仍然没有得到预期的结果,因为&#34;数字&#34;包含它们超过9个字符。如果我拿出更多的字符,我最终会得到很多错误的结果。
我需要的是一种告诉正则表达式采用数字,空格和破折号的方法,但有以下限制:
此外,如果不会返回破折号和空格会很好,但那并不重要
答案 0 :(得分:1)
我建议使用
(?<!\d)\d(?:[ -]?\d){8}(?!\d)
请参阅regex demo。要仅匹配ASCII数字,请将RegexOptions.ECMAScript
选项传递给正则表达式构造函数。
模式详情:
(?<!\d)
- 如果当前位置的左侧有一个数字符号(与(?<=^|\D)
相同),则会导致匹配失败的负面反馈(注意:to避免匹配234.123 4567-89
用(?<!\d\.?)
)\d
- 数字(?:[ -]?\d){8}
- 恰好出现8次空格或-
,然后是任意数字(?!\d)
- 如果当前位置右侧有一个数字(注意:为了防止匹配123456789.34
),则匹配失败的否定前瞻,使用{ {1}}代替)。用于提取匹配项的C#用法:
(?!\.?\d)
答案 1 :(得分:1)
这个正则表达式有效:
(\d\s?-?){9}
它正在寻找9组任意数字,后跟可选的空格和可选的连字符。
因此它会匹配您的所有示例,但也会匹配以下内容:
它是一个简单的正则表达式,但如果要排除带有尾随空格或连字符的匹配项,则可能无法满足您的要求。 Wiktor Stribiżew的答案提供了更复杂的正则表达式,可以更彻底地满足您的需求。