Я пытаюсь написать регулярное выражение для следующих ситуаций:Regex захват и просмотр назад опережение
badword%
%badword
%badword%
В %
знаках различаются, в зависимости от того, где они находятся. A %
спереди нужно искать, чтобы соответствовать буквам, предшествующим слову 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 обратную косую черту следует избегать. –