Как заменить любое вхождение слова между кавычками - PullRequest
5 голосов
/ 04 мая 2011

Мне нужно иметь возможность заменить все вхождения слова "и" ТОЛЬКО когда оно встречается между одинарными кавычками.Например, замена «и» на «XXX» в строке:

This and that 'with you and me and others' and not 'her and him'

Результаты:

This and that 'with you XXX me XXX others' and not 'her XXX him'

Я былв состоянии придумать регулярные выражения, которые почти в каждом случае встречаются, но мне не удается найти «и» между двумя наборами цитируемого текста.

Мой код:

String str = "This and that 'with you and me and others' and not 'her and him'";

String patternStr = ".*?\\'.*?(?i:and).*?\\'.*";
Pattern pattern= Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(str);
System.out.println(matcher.matches());
while(matcher.matches()) {
    System.out.println("in matcher");
    str = str.replaceAll("(?:\\')(.*?)(?i:and)(.*?)(?:\\')", "'$1XXX$2'");
    matcher = pattern.matcher(str);
}

System.out.println(str);

Ответы [ 2 ]

6 голосов
/ 04 мая 2011

Попробуйте этот код:

str = "This and that 'with you and me and others' and not 'her and him'";
Matcher matcher = Pattern.compile("('[^']*?')").matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
   matcher.appendReplacement(sb, matcher.group(1).replaceAll("and", "XXX"));
}
matcher.appendTail(sb);
System.out.println("Output: " + sb);

ВЫХОД

Output: This and that 'with you XXX me XXX others' and not 'her XXX him'
2 голосов
/ 04 мая 2011
String str = "This and that 'with you and me and others' and not 'her and him'";

Pattern p = Pattern.compile("(\\s+)and(\\s+)(?=[^']*'(?:[^']*+'[^']*+')*+[^']*+$)");
System.out.println(p.matcher(str).replaceAll("$1XXX$2"));

Идея в том, что каждый раз, когда вы находите полное слово and, вы сканируете от текущей позиции совпадения до конца строки в поисках нечетного числа одинарных кавычек.Если предварительный просмотр завершается успешно, совпадающее слово должно быть между парой кавычек.

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

Я также предполагаю, что целевое слово никогда не появляется в начале или конце цитируемой последовательности, что кажется разумным для слова and.Если вы хотите разрешить целевые слова, которые не окружены пробелами, вы можете вместо этого использовать что-то вроде "\\band\\b", но помните о проблемах Java в области символов слова против границ слова .

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