$text_expression = 'word1 word2 "phrase 1" "phrase 2" -word3 -word4 -"phrase \"hello\" 3" -"phrase 4"';
我想搜索包含的字符串(word1或word2或'短语1'或'短语2')并且不包含(word3或word4或'短语'hello“3'或'短语4')
什么是正则表达式,相当于上面的$ text_expression?它产生一个像;
的数组[contains] =>数组(
[0] => word1
[1] => word2
[2] => phrase 1
) [不包含] =>数组(
[0] => word3
[1] => word4
[2] => phrase "hello" 3
)
ps:我可以用另一种方式表达字符串,如果它会使它更容易(例如使用其他字符而不是引号和破折号)
答案 0 :(得分:3)
如果您坚持使用正则表达式解决方案,则可以使用lookarounds。
^(?=.*(want|need|desired))(?!.*(noway|dontwant|nonono)).*$
(?=…)
正面前瞻;它断言给定的模式可以匹配。 (?!…)
否定前瞻;它断言给定模式可以 NOT 匹配。
(this|that|somethingelse)
是group
该模式提供以下匹配项(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
答案 1 :(得分:3)
请找一个好的解析库...这个正则表达式太复杂而无法安全使用(主要是因为字符串转义和转义逃逸)。例如,您可以使用PEG parser。
PS。我假设您要解析实际查询$string
,而不是产生一个正则表达式,它将按照问题中的描述过滤文本。
答案 2 :(得分:3)
与正则表达式的负匹配是可能的,但非常复杂。也许你想先搜索第一部分,然后用第二部分过滤结果。你“或”正则表达式|
,所以先查找“word1 | word2 |短语1 |短语2”,然后删除与“word3 | word4 |短语”hello“3 |短语4”匹配的结果(逃避加入|
之前的单词和短语可能是一个好主意。)
答案 3 :(得分:-2)
我可以,而且我愿意,但为了您的利益,我可以谦虚地建议在正则表达式教程中投入2个小时吗?它会很快得到回报。