正则表达式捕获具有特定区间的一系列数字

时间:2018-01-29 17:35:05

标签: 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个数字被分析并检查它是否属于正确指定的正则表达式之一。

不幸的是,我们都没有真正的正则表达式,所以我寻求一些帮助,我们可以修改正则表达式逻辑来捕获下面的bin。感谢

437544
550156
539628
458209
458208

1 个答案:

答案 0 :(得分:1)

以下是找到这些数字的细分,那些 通过此工具获得:
http://www.regexformat.com/version7_files/Rx5_ScrnSht01.jpg

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

此外,实际上可以更快地获取 ALL 有效的16位数字箱号,
将其转储到此实用程序并生成正则表达式 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次匹配