Соответствует каждой строке в кавычках, которая НЕ содержит подстроки

Многострочная тестовая строка:

dkdkdkdk dkdkdkdk dkdkdkd dkdkdkd "hello" dkdkdkdkdk dkdkdk "goodbye.hello"  dkdkdkd kdkdkd kdkdkdk "hello.goodbye.hello" dddd "test" ssss "http:x-y.f/z/z" "" "."
"http:/dkdkd/dkdkdk/dkdkdkdkdkdk.g"

Я хочу сопоставить каждую строку в кавычках, содержащую "hello"

Это соответствует каждой строке в кавычках

\"(.+?)\"

Это соответствует каждой строке в кавычках, которая содержит приветствие.

\"(.*?)hello(.*?)\"

Но это не соответствует каждой строке в кавычках, которая НЕ содержит привет

\"(.*?)(?!hello)(.*?)\"

Спасибо за любую помощь!


person jc.    schedule 05.01.2010    source источник


Ответы (2)


Мой первоначальный ответ заключается в том, что нужно применять отрицательный просмотр вперед каждый раз, когда точка совпадает, например:

\"((?!hello).)*?\"

Однако существует проблема с этим регулярным выражением в целях, содержащих более одной строки в кавычках — пробел между закрывающей кавычкой одной строки и открывающей строкой другой кавычки также является «строкой в ​​кавычках» для этого выражения.

Поэтому я предлагаю извлечь все строки в кавычках из вашей цели, используя простой шаблон "[^"]*", а затем оценить каждое совпадение для слов, которые вы хотите запретить.

person Daniel Vandersluis    schedule 05.01.2010
comment
Лучше использовать "[^"]*" вместо ".*?". - person Gumbo; 06.01.2010
comment
@ Гамбо, я не вижу, какая разница? - person Daniel Vandersluis; 06.01.2010
comment
@Daniel Vandersluis: это позволяет избежать ненужного возврата. - person Gumbo; 06.01.2010

Попробуй это

\"((?!hello).)*?\"
person Paul Creasey    schedule 05.01.2010
comment
Это то, что я придумал сначала, но удалил свой ответ, потому что у него возникла проблема; в тестовой строке он не будет соответствовать "hello", а будет соответствовать " dkdkdkdkdk dkdkdk " - person Daniel Vandersluis; 06.01.2010
comment
Лучше использовать "[^"]*" вместо ".*?". - person Gumbo; 06.01.2010