正则表达式允许;和JAVA中的至少5位数字和修剪前导/尾随分号

时间:2015-03-06 12:19:25

标签: java regex replaceall

这就是我所追求的:

替换所有不是数字而不是分号的字符;什么都没有:“”。 数字必须至少为5位数。 修剪前导和尾随分号;

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

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

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

但是这并没有注意修剪前导和尾随分号,也不会用“”替换太短的数字。

感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您可以使用:

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

RegEx Demo

答案 2 :(得分:1)

您可以使用此替代品:

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

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

另一种方式:

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

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