正则表达式允许; JAVA 中至少有 5 位数字和 trim leading/trailing 分号

Regex allow ; and at least 5 digit numbers and trim leading/trailing semicolon in JAVA

这就是我想要的:

替换所有非数字非分号的字符;什么都没有:“”。 数字的长度必须至少为 5 位。 Trim 前导和尾随分号;

所以: 567834 有效 123456;654321;3456789 有效 123;456 无效(数字太短),将替换为空字符串 "" ;123456;将被修剪为 123456 ;567890 将被修剪为 567890 456789;将被修剪为 456789

我正在考虑使用 replaceAll 方法来完成这项工作。

str.replaceAll("(\d+\;?)*\d+", "");

但这并没有考虑修剪前导和尾随分号,也没有用“”替换太短的数字。

感谢任何帮助!

我建议将问题分成几个步骤。如果你这样做,这是一个简单的问题。单个正则表达式将具有挑战性,无论是今天开发还是以后每天阅读。可读、易于理解的代码应该是您的 objective.

String trimmedStr = str.trim();
String noSemicolons = trimmedStr.replaceAll(";", "");
Matcher matcher = Pattern.compile("^\d{5,}$").matcher(noSemicolons);
boolean isValid = matcher.matches();

您可以使用:

String repl = input.replaceAll(";?\b(\d{5,})\b;?|[\d;]*", "");

RegEx Demo

您可以使用此替换:

String result = input.replaceAll("(\d{5,})|\d{1,4}(?:;+|\z)|;+\d{0,4}\z|\A;", "");

想法是在捕获组中首先保留至少 5 位数的数字(因为左边第一个成功的分支获胜)。其他分支描述了您需要删除的内容。

另一种方式:

String result = input.replaceAll("((?:\d{5,}(?:;(?!\z))?)*+)(?:;*\d{0,4}(?:;+|\z))++", "");

这将字符串描述为一系列要删除的部分,前面是要保留的可选部分。