2010-08-23 78 views
2
$text_expression = 'word1 word2 "phrase 1" "phrase 2" -word3 -word4 -"phrase \"hello\" 3" -"phrase 4"'; 

我想搜索包含(word1或word2 OR'phrase 1'或'phrase 2')并且不包含(word3 OR word4 OR或短语“hello”3或OR'短语4')基本正则表达式帮助

什么是正则表达式相当于上面的$ text_expression?它产生一个数组像;

[含有] =>数组(

) [犯规包含] =>数组(

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

PS:我可以配制串的另一种方式,如果它会使它更容易(例如使用其他字符代替引号和破折号)

+0

请不要以为我只是问问我是懒惰的......我尝试了50个其他变体,并且在那些丑陋的字符之间找不到一些东西。 – Devrim 2010-08-23 20:47:50

+0

在Perl中,由于正则表达式中的代码声明,这会更容易。你可以(用Perl)设置例如匹配期间的变量标志,并简单地在匹配后测试变量:/ ... word1(?{++ $ word_1;})... /,但这在PHP中不起作用。所以看起来你需要对字符串进行多次传递。 – 2010-08-23 21:02:58

回答

3

与正则表达式的负面匹配是可能的,但非常复杂。也许你想先搜索第一部分,然后用第二部分过滤结果。您或“|”的正则表达式,请首先查找“word1 | word2 |短语1 |短语2”,然后移除匹配“word3 | word4 |短语”hello“3 |短语4”的结果(转义单词和短语在加入|之前可能是个好主意)。

-2

我可以,但我愿意,但为了您的利益,我是否可以虚心地建议在正则表达式教程中投入2个小时?它将很快得到回报。

+0

我是否可以虚心承认我的大脑不具备正则表达式=)?请帮助,我保证我会承诺2个小时的开源项目... – Devrim 2010-08-23 20:45:42

+0

已投票。如果你是程序员,你会很多次碰到正则表达式。这是一个非常基本的问题。如果某人在这个级别上“不具有正则表达式”,并且不想改变它,那么现在是认为他们是否有能力编程的好时机。 – viraptor 2010-08-23 21:57:12

+0

thx viraptor。你是男人。 – Devrim 2010-08-23 23:00:01

3

如果你坚持正则表达式的解决方案,你可以使用lookarounds

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

(?=…)先行;它声称一个给定的模式可以匹配。 (?!…) is negative lookahead;它断言一个给定的模式可以与不匹配匹配。

(this|that|somethingelse)alternation

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

+0

我不想坚持正则表达式的解决方案,你有什么想法? – Devrim 2010-08-23 20:57:09

3

请找到一个很好的解析库......这正则表达式是太复杂,安全地使用(主要是因为字符串的逃逸,逃逸,逃逸)。例如,您可以使用PEG parser

PS。我假设你想分析实际查询$string,而不是产生一个正则表达式,它将按照问题中所述过滤文本。

+0

实际上,我正在寻找过滤文本的正则表达式..现在检查PEG,看起来很有趣... – Devrim 2010-08-23 21:07:30

+0

啊 - 在这种情况下,PEG不是你应该使用的东西。 http://stackoverflow.com/questions/3551507/basic-regex-help/3551594#3551594如果你只是想过滤文本,会好得多。 – viraptor 2010-08-23 21:19:32