Я пытаюсь написать регулярное выражение для следующих ситуаций:
badword%
%badword
%badword%
Знаки %
различаются в зависимости от того, где они находятся. %
впереди требует поиска назад, чтобы сопоставить буквы, предшествующие слову badword
, пока не дойдет до небуквенного символа. Точно так же любой %
, который не находится впереди, нуждается в просмотре вперед для сопоставления букв, следующих за словом badword
, до тех пор, пока он не встретит не букву.
Вот чего я пытаюсь достичь. Если у меня есть следующее:
Просто обычная превосходная фраза.
badword # should match "badword", easy enough
badword% # should match "badwording"
%badword% # should match "superbadwording"
В то же время. Если у меня есть подобное предложение:
Вот еще один очень плохой пример.
badword # should match "badword", easy enough
badword% # should also match "badword"
%badword% # should match "verybadword"
Я не хочу использовать пробелы в качестве групп захвата утверждений. Предположим, я хочу захватить \w
.
Вот что у меня есть на Java:
String badword = "%badword%";
String _badword = badword.replace("%", "");
badword = badword.replaceAll("^(?!%)%", "(?=\w)"); // match a % NOT at the beginning of a string, replace with look ahead that captures \w, not working
badword = badword.replaceAll("^%", "(?!=\w)"); // match a % at the beginning of a string, replace it with a look behind that captures \w, not working
System.out.println(badword); // ????
Итак, как я могу этого добиться?
PS: Пожалуйста, не думайте, что %
принудительно переводятся в начало и конец матча. Если %
является первым символом, тогда ему нужно будет смотреть назад, все остальные %
смотрят вперед.
(?!%)%
всегда будет терпеть неудачу, поскольку это означает, что за ним не следует%
, а буквальный%
(который следует за ним).(?!=\w)
- это отрицательный просмотр вперед и означает, что за ним не следует литерал=
и символ слова. В java необходимо экранировать обратную косую черту. - person Casimir et Hippolyte   schedule 07.12.2013