Замените символ da sh между тремя или более числами, разделенными символом da sh пробелом в предложении. - PullRequest
1 голос
/ 09 января 2020

Я хочу заменить da sh между тремя или более числами (каждое число имеет только одну ди git, то есть число от 0 до 9), разделенных da sh одним пробелом в предложение. Какое хорошее решение для этой задачи?

Пример ввода:

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

Но можно ли сделать одну замену или какое-нибудь простое решение?

Ответы [ 3 ]

1 голос
/ 09 января 2020

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

См. this Java demo .

Регулярное выражение немного изменено, чтобы следовать передовым методам (количественные части должны быть перемещены как можно дальше вправо):

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

См. демонстрационную версию regex . Подробности :

  • \b - граница слова
  • \d - один ди git
  • (?:\s?-\s?\d){2,} - два или более:
    • \s?-\s? - -, заключенный в один или ноль пробелов
    • \d - один ди git
  • \b - граница слова
0 голосов
/ 09 января 2020

Вот 1-строчка:

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

Ваш лог c - это «заменить разделители, если есть более 3 чисел», и этот код кратко фиксирует это.

См. live демо .

0 голосов
/ 09 января 2020

Вы можете использовать следующую функцию

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 можно использовать для объединения пролитой строки с помощью разделителя, который в нашем случае равен " ".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...