开发者

basic regex help

开发者 https://www.devze.com 2023-01-12 14:42 出处:网络
$text_expression = \'word1 word2 \"phrase 1\" \"phrase 2\" -word3 -word4 -\"phrase \\\"hello\\\" 3\" -\"phrase 4\"\';
$text_expression = 'word1 word2 "phrase 1" "phrase 2" -word3 -word4 -"phrase \"hello\" 3" -"phrase 4"';

i want to search strings that contains (word1 OR word开发者_StackOverflow社区2 OR 'phrase 1' OR 'phrase 2') AND doesn't contain (word3 OR word4 OR 'phrase "hello" 3' OR 'phrase 4')

what would be the regex expression that is equivalent of $text_expression above? which produces an array like;

[contains] => array (

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

) [doesnt contain] => array (

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

)

ps: I can formulate the string another way if it's going to make it easier (e.g. use other chars instead of quotes and dashes)


Negative match with a regular expression is possible, but very complicated. Maybe you want to search for the first part first, and then filter the results with the second part. You "or" regular expressions with |, so look for "word1|word2|phrase 1|phrase 2" first and then remove results that match "word3|word4|phrase "hello" 3|phrase 4" (escaping the words and phrases before joining with | is probably a good idea).


If you insist on a regex solution, you can use lookarounds.

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

(?=…) is positive lookahead; it asserts that a given pattern can be matched. (?!…) is negative lookahead; it asserts that a given pattern can NOT be matched.

The (this|that|somethingelse) is a group of alternation

The pattern gives the following matches (as seen on 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


Please find a good parsing library... This regex would be too complicated to use safely (mostly because of string escaping and escape-escaping). You could use a PEG parser for example.

PS. I'm assuming you want to parse the actual query $string, not produce a regex which will filter the text as described in the question.


I could, and I would, but for your benefit, may I humbly suggest investing 2 hours in a regex tutorial? It will pay off very quickly.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号