我们正在构建一个模式匹配器以从字符串中查找信用卡模式(不一定是有效模式)。目前我们正在使用来自 regular-expressions.info 的正则表达式
\b(?:\d[ -]*?){13,16}\b
正则表达式工作正常,除非它试图排除长度超过 16 位且具有空格或破折号分隔符的无效数字,例如:
1234 5678 9001 0000 1111
1234-5678-9001-0000-1111
1234 5678 9001 00001 111
1234-5678-9001-00001-111
RegEx 将包含数字的某些部分并将它们标记为匹配。这不是我们所期望的。你可以在regex101.com看到它
有人可以帮助我们吗?
请您参考如下方法:
如果您需要跳过某些东西而只得到其他东西,则可以更轻松地匹配您想要跳过的内容并匹配并捕获您需要保留的内容。
使用
\b(?:(?:\d[ -]*?){17,}|((?:\d[ -]*?){13,16}))\b
参见 regex demo .
详情
\b- 单词边界(?:- 外部非捕获组:(?:\d[ -]*?){17,}- 17 个或更多数字可选地用 0+ 个空格分隔或-|- 或者((?:\d[ -]*?){13,16})- 组 1 匹配 13 到 16 次出现的数字后跟 0+空格或/和连字符
)- 外部组的结尾,仅匹配单词边界内的字符串\b- 单词边界
C#代码:
var values_we_need = Regex.Match(our_text, @"\b(?:(?:\d[ -]*?){17,}|((?:\d[ -]*?){13,16}))\b")
.Cast<Match>()
.Select(m => m.Groups[1].Value)
.ToList();
