Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在句子中用空格替换三个或三个以上由破折号分隔的数字之间的破折号字符_Java_Regex - Fatal编程技术网

Java 在句子中用空格替换三个或三个以上由破折号分隔的数字之间的破折号字符

Java 在句子中用空格替换三个或三个以上由破折号分隔的数字之间的破折号字符,java,regex,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 /

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


但是我能在一次替换或任何简单的解决方案中完成吗?

您可以使用以下功能

private static String unDash(String input) {
    String[] splitString = input.split("\\s*-\\s*");
    if(splitString.length < 3){
        return input;
    } else {
        return String.join(" ", splitString);
    }
}
私有静态字符串unDash(字符串输入){
String[]splitString=input.split(\\s*-\\s*');
if(splitString.length<3){
返回输入;
}否则{
返回字符串。join(“,splitString);
}
}
使用
“\\s*-\\s*”
完成拆分,它负责在将字符串拆分为“-”后修剪字符串
String.join
可用于使用分隔符组合溢出的字符串,在本例中,分隔符为

以下是一行:

String s2 = s1.matches("(\\d+[ -]+){2,}\\d") ? s1.replaceAll("[ -]+", " ") : s1;
您的逻辑是“如果有3个以上的数字,则替换分隔符”,这段代码简洁地捕捉到了这一点

请参阅。

在Java 9+中,您可以使用以下方法:

看。在早期版本中,使用

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);

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

看。详情:

  • \b
    -单词边界
  • \d
    -单个数字
  • (?:\s?-\s?\d){2,}
    -两次或多次出现:
    • \s?-\s?
      -包含一个或零个空格的
      -
    • \d
      -单个数字
  • \b
    -单词边界

这将导致我在文本是字符串序列时出错,例如:
替换三个字符之间的破折号
。但是我会考虑把这个解决方案应用到我的项目中,如果它不影响其他情况的话!Sr,如果编号顺序不以破折号分隔,则也将替换,例如:
4D2-3-1
@Nguyễ内华达州ế你看到了修正后的答案(尽管你的例子没有表明这样的输入是可能的)@Nguyễ内华达州ế你不应该像那样更新这个问题,因为现在它是一个不同的问题。所有可能帮助他人的答案现在都无效。请撤消编辑并提出新问题。
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);
\b\d(?:\s?-\s?\d){2,}\b