使用正则表达式(regex)匹配数字模式

jexiocij  于 2023-06-30  发布在  其他
关注(0)|答案(2)|浏览(130)

需要您的帮助,在匹配一些数字模式使用正则表达式。我有数以千计的10位数的数字在下面的模式,需要提取他们根据他们的模式。
注意:我不需要中间的空格。

模式1:数字:3527 432 432让我们把上面的数字看作ABCD XYZ XYZ模式
模式二:编号:3527 89 89 89 ABCD XY XY XY
模式3:电话:0351 - 88888888传真:0351 - 88888888
图案4:5432 888 999 ABCD XXX YYY
图案五:5432 8888 99 ABCD XXXX YY
图案65432 33 44 22 ABCD XX YY ZZ

任何形式的帮助都非常感谢。
我是一个完整的正则表达式初学者,知道基本的东西。
对于5432 8888 99这样的模式
我正在使用正则表达式,如\d\d\d\d8888\d\d
然后通过将8888改变为其他数字(如1111)来手动地从列表中找到匹配的数字。

dnph8jn4

dnph8jn41#

要检查相同的符号,可以使用backreferences
简而言之,像(.)\1这样的正则表达式将匹配一行中的两个相同符号,而(.)(.)\1\2将匹配像abab这样的出现。
以下是您案例的表达式:

  1. \d{4}(\d{3})\1
  2. \d{4}(\d{2})\1{2}
  3. (\d{2})\1{2}\d{4}
  4. \d{4}(\d)\1{2}(\d)\2{2}
  5. \d{4}(\d)\1{3}(\d)\2
  6. \d{4}(\d)\1(\d)\2(\d)\3
    对第一个的解释:
  • \d{4}匹配任何for数字,
  • (\d{3})匹配任意三个数字,并将它们捕获到组#1中,
  • \1匹配组#1的确切内容。

我希望基于这个解释和对反向引用如何工作的一般描述,其他表达式应该非常清楚。
第一个here的演示。

xxls0lw8

xxls0lw82#

最简单的方法是为每种格式编写一个模式。
然后,在它们后面添加|字符。
模式1和4。

\d{4} \d{3} \d{3}

模式2和6。

\d{4} \d{2} \d{2} \d{2}

模式3.

\d{2} \d{2} \d{2} \d{4}

模式5.

\d{4} \d{4} \d{2}

最后的模式是,

\d{4} \d{3} \d{3}|\d{4} \d{2} \d{2} \d{2}|\d{2} \d{2} \d{2} \d{4}|\d{4} \d{4} \d{2}

或者简化为

\d{4}(?: \d{3}){2}|\d{4}(?: \d{2}){3}|(?:\d{2} ){3}\d{4}|(?:\d{4} ){2}\d{2}

然后,您可以使用 PatternMatcher 类来获取每个值。
然后,使用 String#replace 方法删除空格。
这假定它们在文本中,并且每个都由其他字符分隔。
如果值是连续的而不是分隔的,我就不会依赖这种模式。

String string = "3527 432 432, 3527 89 89 89, 35 35 35 8745, 5432 888 999, 5432 8888 99, 5432 33 44 22";
Pattern pattern = Pattern.compile("\\d{4}(?: \\d{3}){2}|\\d{4}(?: \\d{2}){3}|(?:\\d{2} ){3}\\d{4}|(?:\\d{4} ){2}\\d{2}");
Matcher matcher = pattern.matcher(string);
while (matcher.find())
    System.out.printf("%-20s = %s%n", matcher.group(), matcher.group().replace(" ", ""));

输出量

3527 432 432         = 3527432432
3527 89 89 89        = 3527898989
35 35 35 8745        = 3535358745
5432 888 999         = 5432888999
5432 8888 99         = 5432888899
5432 33 44 22        = 5432334422

这里有一个链接到 Wikipedia 关于 * 正则表达式 * 的文章。

相关问题