如何编写正则表达式以匹配以下数字格式?

时间:2017-05-10 22:37:20

标签: c++ regex

我对编写正则表达式相当新。

我需要将以下模式(所有数字)与单个正则表达式匹配。 以下各项都是我想要匹配的有效模式。 找到它们中的任何一个都应该满足正则表达式

每个#符号是一位[0-9]

##################      
#### #### #### #### ##  
######## ##########     
##########                  

18位,无分隔符
18位数字分隔
10位数

我试过这个以匹配10位数,但它不匹配。

(?: \d{10} )

2 个答案:

答案 0 :(得分:1)

(注意我不确定这是否适用于C ++,但它在正常的在线正则表达式检查器中正在运行正则表达式) (编辑:你的问题没有说明你的分隔符是什么。我正在使用'。'或' - ',但它们可以替换为任何东西,例如'\ s')

(?=(\d{18}))|(?=(\d{10}))|(?=((?>\d{4}[-.]){4}\d{2}))|(?=(\d{5}[-.]\d{5}))

让我打破这个:

  • |组之间的每个(?=...)都是逻辑OR。正则表达式将返回成功匹配的第一个组。

  • (?=...)表示“积极向前看”

  • (?=(\d{18}))返回一组18位连续数字[0-9]

  • (?=(\d{10}))返回一组10个连续数字[0-9]

  • (?=((?>\d{4}[-.]){4}\d{2}))返回一个符合(4个连续数字后跟“。”或“ - ”)模式的组,重复4次(模式,而不是确切的值),然后是2位数。 (?>...)位仅表示“不捕获此组”

  • (?=(\d{5}[-.]\d{5}))返回一组5个连续数字后跟“。”或' - '后跟5位数

这绝不是写这个的唯一方法,而其他人可能有更优雅的解决方案。但这很有效!

答案 1 :(得分:1)

这应该做你想要的:

(\d *){17}\d|\d{10}

第一个选项匹配任意17个数字,后跟0个或更多个空格,后跟第18个数字。第二个选项仅匹配10个连续数字。

如果您希望数字之间最多有一个空格,则可以改为:

(\d ?){17}\d|\d{10}

请注意,匹配项中仍会包含空格,因此您需要在之后删除空格。

如果可以有其他分隔符,例如-,您可以使用以下字符列表:

(\d[- ]?){17}\d|\d{10}