我对编写正则表达式相当新。
我需要将以下模式(所有数字)与单个正则表达式匹配。 以下各项都是我想要匹配的有效模式。 找到它们中的任何一个都应该满足正则表达式
每个#符号是一位[0-9]
##################
#### #### #### #### ##
######## ##########
##########
18位,无分隔符
18位数字分隔
10位数
我试过这个以匹配10位数,但它不匹配。
(?: \d{10} )
答案 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}