这就是我所追求的:
替换所有不是数字而不是分号的字符;什么都没有:“”。 数字必须至少为5位数。 修剪前导和尾随分号;
所以: 567834有效 123456; 654321; 3456789有效 123; 456无效(太短的数字),将被替换为空字符串“” ; 123456;将被修剪为123456 ; 567890将被修剪为567890 456789;将被修剪为456789
我正在考虑使用replaceAll方法来完成工作。
str.replaceAll("(\\d+\\;?)*\\d+", "");
但是这并没有注意修剪前导和尾随分号,也不会用“”替换太短的数字。
感谢任何帮助!
答案 0 :(得分:1)
我建议将问题分解为几个步骤。如果你这样做,这是一个容易的问题。单个正则表达式将具有挑战性,无论是今天开发还是每天阅读。可读,易于理解的代码应该是您的目标。
String trimmedStr = str.trim();
String noSemicolons = trimmedStr.replaceAll(";", "");
Matcher matcher = Pattern.compile("^\d{5,}$").matcher(noSemicolons);
boolean isValid = matcher.matches();
答案 1 :(得分:1)
答案 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");
这个字符串将字符串描述为要删除的一系列要删除的部分,前面是要保留的可选部分。