Я использую "\\b(\\w+)(\\W+\\1\\b)+"
вместе с input = input.replaceAll(regex, "$1");
, чтобы найти повторяющиеся слова в строке и удалить дубликаты. Например, строка input = "for for for" станет "for".Java regex (? I) vs Pattern.CASE_INSENSITIVE
Однако это не удается превратить «Привет привет» в «Привет», хотя я использовал Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Я могу это исправить с помощью "(?i)\\b(\\w+)(\\W+\\1\\b)+"
, но я хочу знать, почему это необходимо? Почему я должен использовать флаг (? I), когда я уже указал Pattern.CASE_INSENSITIVE?
Heres полный код для ясности:
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DuplicateWords {
public static void main(String[] args) {
String regex = "\\b(\\w+)(\\W+\\1\\b)+";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Scanner in = new Scanner(System.in);
int numSentences = Integer.parseInt(in.nextLine());
while (numSentences-- > 0) {
String input = in.nextLine();
Matcher m = p.matcher(input);
// Check for subsequences of input that match the compiled pattern
while (m.find()) {
input = input.replaceAll(regex, "$1");
}
// Prints the modified sentence.
System.out.println(input);
}
in.close();
}
}
Так влияет только блок сразу после него (в этом случае \\ 1), а не весь регулярное выражение? – Paddy
Да, это правильно – anubhava
Я все еще не понимаю, почему я должен использовать (? I) вообще. Should'nt Pattern.CASE_INSENSITIVE достаточно? – Paddy