正则表达式:匹配帐号,但不匹配令牌/生日
Posted
技术标签:
【中文标题】正则表达式:匹配帐号,但不匹配令牌/生日【英文标题】:Regex: Matching account numbers, but not tokens/birthdays 【发布时间】:2017-10-01 17:08:19 【问题描述】:我正在为以下正则表达式苦苦挣扎:
\b[\dBb][-. \dEe]+(\d4)\b
它应该匹配帐号,但不能匹配令牌/生日或带有“be”的文本。 在community 的支持下,我设法捕获了第一部分。但是,我似乎无法排除令牌/生日。
应该匹配的大小写(我的正则表达式工作正常):
1234 1234 1234 1234
1234 1234 1234 1234 1
BE12 1234 1234 1234
1234-1234-1234-1234
1234.1234.1234.1234
1234123412341234
12341234 1234 1234
1234-1234-1234-1234-1
1234.1234.1234.1234.1
12341234123412341
12341 234 1234 12341
BE12-1234-1234-1234
be12-1234-1234 1234
Be12.1234.1234-1234
BE12123412341234
不应匹配的情况(我的正则表达式对其中一些情况不正确):
123456
Token: 123456
I shall be awesome in Belgium, as my birthdate is 01/01/2000.
01.01.2000
01012000
first of january 2000
您能帮忙解决这个挑战吗? 谢谢!
【问题讨论】:
哇,太棒了!您可以提交您的回复作为答案,以便我接受吗? 等等,如果您需要在更大的文本中匹配这些字符串,那将无法正常工作。另外,有效字符串是否应该以 4 位数字结尾(正如您的模式所暗示的那样)? 文本将始终是最多 256 个字符的字符串,可能有换行符。需要匹配的字符串确实总是以4位数字结尾。 抱歉,如果您需要从较大的字符串中提取这些字符串,我认为没有办法过滤掉不需要的匹配项。01012000
令牌类似于您预期的 12341234 1234 1234
匹配的第一部分。你怎么能分辨出一个和另一个?
此条件但不是令牌/生日或带有“be”的文本与您的正则表达式相矛盾。
【参考方案1】:
匹配 BE 或 2 位数字,后跟 14 或 15 位数字,其中穿插有空格、句点和破折号
([Bb][Ee]|\d\d)([-. ]?\d)14,15
测试:
ACCOUNT INPUT
1234123412341234 1234 1234 1234 1234
12341234123412341 1234 1234 1234 1234 1
BE12123412341234 BE12 1234 1234 1234
1234123412341234 1234-1234-1234-1234
1234123412341234 1234.1234.1234.1234
1234123412341234 1234123412341234
1234123412341234 12341234 1234 1234
12341234123412341 1234-1234-1234-1234-1
12341234123412341 1234.1234.1234.1234.1
12341234123412341 12341234123412341
12341234123412341 12341 234 1234 12341
BE12123412341234 BE12-1234-1234-1234
be12123412341234 be12-1234-1234 1234
Be12123412341234 Be12.1234.1234-1234
BE12123412341234 BE12123412341234
No Match 123456
No Match Token: 123456
No Match I shall be awesome in Belgium, as my birthdate is 01/01/2000.
No Match 01.01.2000
No Match 01012000
No Match first of january 2000
Be12123412341234 Here is my account number Be12.1234.1234-1234. have a nice day
验证器(Ruby):
a = [ "1234 1234 1234 1234",
...
]
puts 'ACCOUNT INPUT'
a.each |s|
match = /(([Bb][Ee]|\d\d)([-. ]?\d)14,15)/ =~ s
puts "%-18s %s"%[ match ? $1.tr('-. ', '') : "No Match", s ]
【讨论】:
以上是关于正则表达式:匹配帐号,但不匹配令牌/生日的主要内容,如果未能解决你的问题,请参考以下文章