Шаблон, совпадение в Java, помощь REGEX - PullRequest
1 голос
/ 04 августа 2010

Я пытаюсь просто избавиться от повторяющихся последовательных слов из текстового файла, и кто-то упомянул, что я могу сделать что-то вроде этого:

Pattern p = Pattern.compile("(\\w+) \\1");
StringBuilder sb = new StringBuilder(1000);
int i = 0;
for (String s : lineOfWords) { // line of words is a List<String> that has each line read in from txt file
Matcher m = p.matcher(s.toUpperCase());
// and then do something like
while (m.find()) {
  // do something here
}

Я попытался посмотреть на m.end, чтобы посмотреть, смогу ли я создать новую строку или удалить элементы, где есть совпадения, но я не был уверен, как это работает после прочтения документации. Например, в качестве тестового примера, чтобы увидеть, как это работает, я сделал:

if (m.find()) {
System.out.println(s.substring(i, m.end()));
    }

К текстовому файлу, который имеет: This is an example example test test test.

Почему мой вывод This is?

Edit:

если у меня есть AOriList lineOfWords, который читает каждую строку из строки файла .txt, а затем я создаю новый ArrayList для хранения измененной строки. Например

List<String> newString = new ArrayList<String>();
for (String s : lineOfWords { 
   s = s.replaceAll( code from Kobi here);
   newString.add(s);
} 

но тогда это не дает мне новые s, а оригинальные s. Это из-за мелкого или глубокого копирования?

Ответы [ 2 ]

3 голосов
/ 04 августа 2010

Попробуйте что-то вроде:

s = s.replaceAll("\\b(\\w+)\\b(\\s+\\1)+\\b", "$1");

Это регулярное выражение немного сильнее вашего - оно проверяет целые слова (без частичных совпадений) и избавляется от любого количества последовательных повторений.
Регулярное выражение захватывает первое слово: \b(\w+)\b, а затем пытается сопоставить пробелы и повторения этого слова: (\s+\1)+. Последний \b должен избежать частичного совпадения \1, как в "for formatting".

1 голос
/ 04 августа 2010

Первое совпадение - "Th IS IS пример ...", поэтому m.end() указывает на конец второго "is".Я не уверен, почему вы используете i в качестве начального индекса;вместо этого попробуйте m.start().

Чтобы улучшить регулярное выражение, используйте \b до и после слова, чтобы указать, что должны быть границы слова: (\\b\\w+\\b).В противном случае, как вы видите, вы получите совпадения внутри слов.

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