我想替换三个或更多数字之间的破折号(每个数字只有一位数字,即从 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
请参阅online Java demo 。在早期版本中,使用
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);
参见this Java demo .
对正则表达式进行了一些修改,以遵循最佳实践(量化部分应尽可能移至右侧):
\b\d(?:\s?-\s?\d){2,}\b
请参阅regex demo 。 详细信息:
-
\b
- 单词边界 -
\d
- 一位数字 -
(?:\s?-\s?\d){2,}
- 出现两次或两次以上:-
\s?-\s?
- 一个-
用一个或零个空格括起来 -
\d
- 一位数字
-
-
\b
- 单词边界
关于java - 将句子中用破折号分隔的三个或多个数字之间的破折号字符替换为空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59656827/