将短划线字符替换为句子中的空格,用短划线分隔的三个或更多数字



我想用短划线替换三个或更多数字之间的破折号(每个数字只有一个数字,即 0 - 9 之间的数字(,用短划线分隔,句子中的一个空格。完成此任务的好解决方案是什么?

示例输入:

4-2-2-1 kim yoong-yun
4 -2 - 2 - 1 and 4 - 5
1-2-3-4-5
1-5
4 - 5

预期输出:

4 2 2 1 kim yoong-yun
4 2 2 1 and 4 - 5
1 2 3 4 5
1-5         // will not replace
4 - 5       // will not replace

我知道我可以通过这种复杂的方法做到这一点:

String sentence = "4-2-3-1";
Pattern pCode = Pattern.compile("\b(?:\d ?- ?){2,}\d");
Matcher mCode = pCode.matcher(sent);
while (mCode.find()) {
sentence = mCode.replaceFirst(mCode.group(0).replaceAll(" ?- ?", " "));
mCode = pCode.matcher(sent);
}
System.out.print(sentence) // 4 2 3 1

但是我可以通过一个替换或任何简单的解决方案来完成吗?

在Java 9+中,你可以使用Matcher#replaceAll​(Function<MatchResult,String> replacer)方法:

String sentence = "4-2-3-1";
Pattern pCode = Pattern.compile("\b\d(?:\s?-\s?\d){2,}\b");
Matcher mCode = pCode.matcher(sentence);
String result = mCode.replaceAll(x -> x.group().replace("-", " ") );
System.out.println( result ); // => 4 2 3 1

请参阅在线 Java 演示。在早期版本中,请使用

String sentence = "4-2-3-1";
Pattern pCode = Pattern.compile("\b\d(?:\s?-\s?\d){2,}\b");
Matcher mCode = pCode.matcher(sentence);
StringBuffer sb = new StringBuffer();
while (mCode.find()) {
mCode.appendReplacement(sb,  mCode.group().replace("-", " "));
}
mCode.appendTail(sb);

请参阅此 Java 演示。

正则表达式进行了一些修改以遵循最佳实践(量化部分应尽可能向右移动(:

bd(?:s?-s?d){2,}b

请参阅正则表达式演示。详情

  • b- 词界
  • d- 个位数
  • (?:s?-s?d){2,}- 出现两次或多次:
    • s?-s?- 用一个或零个空格括起来的-
    • d- 个位数
  • b- 字界

您可以使用以下函数

private static String unDash(String input) {
String[] splitString = input.split("\s*-\s*");
if(splitString.length < 3){
return input;
} else {
return String.join(" ", splitString);
}
}

拆分是使用"\s*-\s*"完成的,它负责在按"-"拆分字符串后修剪字符串。String.join可用于使用分隔符组合溢出字符串,在我们的例子中是" ".

这是一个 1 行:

String s2 = s1.matches("(\d+[ -]+){2,}\d") ? s1.replaceAll("[ -]+", " ") : s1;

您的逻辑是"如果数字超过 3 个,请替换分隔符",此代码简洁地捕获了这一点。

观看现场演示。

最新更新