java - 将句子中用破折号分隔的三个或多个数字之间的破折号字符替换为空格

标签 java regex

我想替换三个或更多数字之间的破折号(每个数字只有一位数字,即从 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/

相关文章:

Java正则表达式查找十六进制字符串

java - 在LibGDX And​​roid部署中执行transformClassesWithDexForDebug失败

java - Java中使用数组结构的假动态数组

java - 从 Java.util.Deque 中选择一个随机元素

java - java中如何组合数组列表字符串?

javascript - 将字符串作为正则表达式模式传递给 String.prototype.replace

c# - 如何使用正则表达式从隐藏字段中获取值属性?

java - 如何使用正则表达式获取目录中的所有文件(排除子目录)?

java - 使用一个 "catch all"setter 或 getter 时避免额外方法参数的设计模式?

java - 使用正则表达式,如何提取顶级域名?