основная помощь по регулярным выражениям - PullRequest
2 голосов
/ 24 августа 2010
$text_expression = 'word1 word2 "phrase 1" "phrase 2" -word3 -word4 -"phrase \"hello\" 3" -"phrase 4"';

я хочу найти строки, которые содержат (слово1 ИЛИ слово2 ИЛИ «фраза 1» ИЛИ «фраза 2») И не содержат (слово3 ИЛИ слово4 ИЛИ «фраза« привет »3« ИЛИ »фраза 4 ')

Какое выражение регулярного выражения эквивалентно приведенному выше $ text_expression?который создает массив типа;

[содержит] => массив (

[0] => word1 
[1] => word2 
[2] => phrase 1 

) [не содержит] => массив (

[0] => word3 
[1] => word4 
[2] => phrase "hello" 3

)

ps: я могу сформулировать строку другим способом, если она будет упрощена (например, использовать другие символы вместо кавычек и тире)

Ответы [ 4 ]

3 голосов
/ 24 августа 2010

Отрицательное совпадение с регулярным выражением возможно, но очень сложно.Может быть, вы хотите сначала найти первую часть, а затем отфильтровать результаты со второй частью.Вы "или" регулярные выражения с |, поэтому сначала найдите слово "word1 | word2 | фраза 1 | фраза 2", а затем удалите результаты, соответствующие слову "word3 | word4 | фраза" привет "3 | фраза 4" (экранируя словаи фразы перед соединением с |, вероятно, хорошая идея).

3 голосов
/ 24 августа 2010

Если вы настаиваете на решении регулярных выражений, вы можете использовать lookarounds .

^(?=.*(want|need|desired))(?!.*(noway|dontwant|nonono)).*$

(?=…) - положительный lookahead;он утверждает, что данный шаблон может быть сопоставлен.(?!…) является отрицательным с нетерпением;он утверждает, что данный шаблон может НЕ быть сопоставленным.

(this|that|somethingelse) является группой из чередования

Шаблон дает следующие совпадения (, как видно на rubular.com ):

i want you
i need you
nonono i don't want you
noway noway noway
i in noway desired you
you desired me, though

3 голосов
/ 24 августа 2010

Пожалуйста, найдите хорошую библиотеку для разбора ... Это регулярное выражение было бы слишком сложным для безопасного использования (в основном из-за экранирования строк и экранирования).Например, вы можете использовать PEG parser .

PS.Я предполагаю, что вы хотите проанализировать фактический запрос $string, а не создавать регулярное выражение, которое будет фильтровать текст, как описано в вопросе.

0 голосов
/ 24 августа 2010

Я мог бы и хотел бы, но для вашего удобства, могу ли я скромно предложить инвестировать 2 часа в учебник по регулярным выражениям?Это окупится очень быстро.

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