java - 正则表达式捕获具有特定容器的一系列数字

标签 java regex

我们使用下面的正则表达式来捕获属于特定垃圾箱的现有卡号,并将其用于一些分析。

适用于以 5 开头的卡片箱

^(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}$

适用于以 4 开头的卡片箱

^4[0-9]{12}(?:[0-9]{3})?$

需要捕获一组新的卡片箱(见下文),但上面显示的正则表达式无法捕获它。 输入是 16 位的完整卡号,分析并检查前 6 个数字是否属于刚刚指定的正则表达式之一。

不幸的是,我们中没有一个人真正擅长正则表达式,因此我寻求一些帮助来了解如何修改正则表达式逻辑以捕获下面的垃圾箱。谢谢

437544
550156
539628
458209
458208

最佳答案

这里是查找这些数字的分段,这些数字。
通过该工具获取:
http://www.regexformat.com/version7_files/Rx5_ScrnSht01.jpg

注意这是一个三元树变成了正则表达式 trie使其成为最快
这个星球上有这个东西的正则表达式。

此外,获取所有个有效的 16 位 bin 编号实际上可能会更快,
将其转储到此实用程序中并生成正则表达式trie
这是地球上最快的方法。没有其他方法更快。
该实用程序接受无限数量的字符串。
示例-
175,000 word dictionary
100,000 domains

(?:4(?:0(?:2016|632[79])|1(?:4758|7997)|20230|3754[48]|40413|5(?:7(?:377|852)|82(?:0[89]|1[012])|9227)|69679)|5(?:2(?:1570|8243|9909)|39(?:179|628)|50(?:043|156)))

您所要做的就是将其放入正则表达式开头的断言中:
^(?= <this regex> ) <existing regex> $

您实际上可以您的两个正则表达式合并为一个,为每个正则表达式提供一个捕获
组作为其符合资格的垃圾箱的标志。

^(?= <this regex> ) (?: (<existing regex for 4>) | (<existing regex for 5>) )$

已格式化

 (?:
      4
      (?:
           0
           (?: 2016 | 632 [79] )
        |  1
           (?: 4758 | 7997 )
        |  20230
        |  3754 [48] 
        |  40413
        |  5
           (?:
                7
                (?: 377 | 852 )
             |  82
                (?: 0 [89] | 1 [012] )
             |  9227
           )
        |  69679
      )
   |  5
      (?:
           2
           (?: 1570 | 8243 | 9909 )
        |  39
           (?: 179 | 628 )
        |  50
           (?: 043 | 156 )
      )
 )
<小时/>

Benchmark示例

第一个基准测试的输入样本是 27 个条目。
第二个基准测试的输入样本是重复的 27 个条目以获得 1,000,000 个条目。

437544
437548
458212
469679
457377
457852
469679
458212
420230
402016
406327
406329
528243
521570
529909
539179
550043
550156
539628
458209
458208
417997
459227
458210
440413
458211
414758

基准 - 1

Options:  < none >
Completed iterations:   38  /  38     ( x 1000 )
Matches found per iteration:   27
Elapsed Time:    1.008 s,   1008.38 ms,   1008383 µs

每 1.008 秒 38,000 次迭代 * 每次迭代 27 次匹配 = 每秒 1,017,857 次匹配

基准 - 2

Options:  < none >
Completed iterations:   1  /  1     ( x 1 )
Matches found per iteration:   1000000
Elapsed Time:    0.96 s,   959.45 ms,   959451 µs

每 0.96 秒 1 次迭代 * 每次迭代 1,000,000 次匹配 = 每秒 1,026,000 次匹配

关于java - 正则表达式捕获具有特定容器的一系列数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48506936/

相关文章:

java - 如何将多个复选框传递给 Action

java - 我应该将我的 SQLite 类变成单例吗?

java - 为什么我的 Iterator 搜索会输出此异常?

regex - 使用 lua 脚本解析 csv

regex - 在egrep中查找某组数字

regex - 需要处理 TCL 正则表达式的指导

java - 测试位置/字符是否在 HTML 标记内

java - jsp/servlet,为管理员、用户和未登录用户显示不同的链接

python - 使用 python 的正则表达式检测 2 个连续大写字母的问题

regex - 使用 PostgreSQL regexp_replace 函数删除连续的重复字符