2013-12-07 3 views
1

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

+1

'(?!%)%' всегда будет терпеть неудачу, так как это означает, что не следует '%' и буквальный '%' (что следует). '(?! = \ w)' является отрицательным взглядом и означает «не сопровождаемый буквальным символом' = 'и символом слова». В java обратную косую черту следует избегать. –

ответ

2

Из Вашего вопроса не представляется необходимым использовать lookaround, так что вы можете просто заменить все % с \w*

Snippet:

String tested = "Just a regular superbadwording sentece."; 
String bad = "%badword%"; 
bad = bad.replaceAll("%", "\\\\w*"); 
Pattern p = Pattern.compile(bad); 
Matcher m = p.matcher(tested); 
while(m.find()) { 
    String found = m.group(); 
    System.out.println(found); 
} 

\ ш не соответствует #, - и т.д. ,поэтому я думаю, что \ S здесь лучше

+0

Похоже, я получил это на работу, спасибо большое. :) –

1
badword = badword.replaceAll("^%", "(?!=\w)"); 
// match a % at the beginning of a string, replace it with a look behind 
//that captures \w, not working 

(?!=\w) является отрицательным смотреть вперед для =\w, но кажется, что вы хотите, позитивный взгляд фоновым. Во-вторых, взгляды и взгляды являются атомарными и, следовательно, по своей сути не захватываются, поэтому, если я прав в своей интерпретации, вы хотите:

"(?<=(\\w+))". Для захвата вам понадобится дополнительно (). Для вашей первой части это будет: "(?=(\\w+)), а первый аргумент должен быть "(?<!^)%".

PS: Вам нужны две обратные косые черты для \\w, и вам кажется, что нужно совместить несколько символов, нет? Если это так, вам понадобится \\w+. Кроме того, если вы не хотите делать это для каждого случая, я предлагаю использовать String.format() вместо replaceAll().

+0

Включение поиска в группу захвата ничего не решает. Все дело в том, что они не * потребляют * то, что они соответствуют, поэтому, даже если поиск завершен, все, что вы собираетесь собирать в этой группе, - пустая строка. –

+0

@AlanMoore Stupid опечатка, я сделал это на своем телефоне. Должно быть правильным сейчас. –

Смежные вопросы