Обнаруживать слова, удвоенные с Regex

Я пробую находить все дублированные элементы, которые есть во фразе.

Для этого, я пытаюсь со следующим кодом, но только обнаруживаю первое дублированное слово и мне хотелось бы заменять все, независимо, которого они имели прописные или мелкие.

Это мой код:

public static void main(String[] args) {

String regex = "\\b(\\w+)\\s+\\1\\b+";
Pattern p = Pattern.compile(regex,Pattern.CASE_INSENSITIVE /* Insert the correct Pattern flag here.*/);
Scanner in = new Scanner(System.in);
String input = in.nextLine();
Matcher m = p.matcher(input);
while (m.find()) {
        input = input.replaceAll(m.group(), m.group(1));
    }

    // Prints the modified sentence.
    System.out.println(input);
}

Например, во фразе:

Hola hola hOla

Он был бы должен печатать только:

Hola

В настоящее время он печатает меня:

Hola hOla
2
задан 04.01.2017, 15:28
0 ответов

Попытайся с этим:

String regex = "\\b(\\w+)\\b(\\s+\\1)+\\b";

Объяснение:

\b они показывают нам предел слова, без них например один "Hola OLA" он совпал бы с Hola так как снимая H главный файл был бы правильным "ola OLA", но мы хотим, чтобы он смотрел полные слова.

\w он показывает нам характер ([a-zA-Z0-9_]) и + у которого может быть несколько символов длины. Следовательно \w+ он показывает нам, что это слово.

\s+ он показывает нам, что он может содержать один или больше места.

\1 сохраняй наш первый блок выражения (то, что он содержит \w+), следовательно он должен быть равен.

+ конец значит, что может повторяться несколько раз выражение \s+\1.

Следовательно в конце концов мы получаем выражение, сформированное из-за Palabra1 + (Espacio+Palabra), когда могут повторяться (Espacio+Palabra1) n разы.

3
ответ дан 03.12.2019, 17:53
  • 1
    Ты можешь объяснять нам qué он делает expresió n регулировать, что ты показываешь нам? Смоги помогать для demá в. –  04.01.2017, 15:08
  • 2
    Я заношу в список, надеюсь, что он это осветляет немного. Не tení в большое количество времени раньше и я дал ему ответ rá попросите. Привет –  04.01.2017, 20:48
  • 3
    Спасибо за решение. У меня другое сомнение есть касательно твоего regex, предполагается, что word boundaries \\b (искавший главный файл) \\b должны идти в парах открытия и завершения, или я неправильный? –  04.01.2017, 23:58
  • 4
    Если, я верю в то, что помню, что он был лучше así что я издал это тебе rá я прошу первый раз, который был с работой. –  05.01.2017, 02:18
  • 5
    @pitiklan он не необходим, чтобы они пошли в пары. Они совпадают в posició n между одним \w и одним \W или началом / концом текста. В самом деле, \b, использованный в способе это не очень нужно, так как всегда existirá lí mite полного слова между словом и местом –  06.01.2017, 19:25

Понимая, что ищутся дубликаты последующие, отделенные местом, есть 2 момента, которые нужно исправлять на коде, который ты пробуешь:

  1. В использованном главном файле, только ищется 1 слово последующее с \s+\1\b+, так как последний + только повтори в \b (и это не очень нужно). Взамен, debería повторять весь этот субглавный файл, группируя с (?:\s+\1)+\b.

  2. Используется сначала цикл для того, чтобы находить совпадения, и потом для того, чтобы заменять расположенный напротив string, что-то, что он может приводить к тому, чтобы заменять в неправильных местах. Взамен, было бы нужно использовать Matcher.replaceAll (), чтобы реализовывать все замены с уникумом, призванным к методу. Поскольку я заменяю, мы используем $1 чтобы слово относится к задержанному тексту ее первый.

Regex:

\b(\w+)(?: +\1)+\b

Замена:

$1

Текст:

Hola hola hOla

Результат:

Hola

Код:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
final String regex = "\\b(\\w+)(?: +\\1)+\\b";
final Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);

final String reemplazo = "$1";

Scanner in = new Scanner(System.in);
String input = in.nextLine();
Matcher m = p.matcher(input);

//Se reemplazan todas las ocurrencias
input = m.replaceAll(reemplazo);

System.out.println(input);

Demo:

http://ideone.com/2oOOhI


Однако, предыдущее решение не считает тильды в словах. Чтобы считать их, возможно использовать модификатор UNICODE_CHARACTER_CLASS.

final Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CHARACTER_CLASS);
2
ответ дан 03.12.2019, 17:53

Теги

Похожие вопросы