【问题标题】:basic regex help基本正则表达式帮助
【发布时间】:2010-08-23 20:40:40
【问题描述】:
$text_expression = 'word1 word2 "phrase 1" "phrase 2" -word3 -word4 -"phrase \"hello\" 3" -"phrase 4"';

我想搜索包含(word1 OR word2 OR 'phrase 1' OR 'phrase 2')且不包含(word3 OR word4 OR 'phrase "hello" 3' OR 'phrase 4')的字符串

与上面的 $text_expression 等效的正则表达式是什么?它产生一个像;

[包含] => 数组 (

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

) [不包含] => 数组 (

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

)

ps:如果要使字符串更容易,我可以用另一种方式来表述字符串(例如,使用其他字符而不是引号和破折号)

【问题讨论】:

  • 请不要以为我只是问 b/c 我很懒...我尝试了 50 种其他变体,但在那些丑陋的字符之间发现了一些不起作用的东西。
  • 在 Perl 中,由于正则表达式中的代码断言,这会更容易。您可以(在 Perl 中)设置例如在匹配期间标记变量并在匹配后简单地测试变量:/ ... word1(?{ ++$word_1; }) .../,但这在 PHP 中不起作用。所以看起来你必须对字符串进行多次传递。

标签: php regex


【解决方案1】:

可以用正则表达式进行否定匹配,但非常复杂。也许你想先搜索第一部分,然后用第二部分过滤结果。你用|“或”正则表达式,所以先查找“word1|word2|phrase 1|phrase 2”,然后删除匹配“word3|word4|phrase “hello”3|phrase 4”的结果(转义词和短语加入| 可能是个好主意)。

【讨论】:

    【解决方案2】:

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

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

    (?=…)积极前瞻;它断言可以匹配给定的模式。 (?!…)否定前瞻;它断言给定的模式可以匹配。

    (this|that|somethingelse)groupalternation

    该模式提供以下匹配项 (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

    【讨论】:

    • 我不想坚持使用正则表达式解决方案,你有什么想法吗?
    【解决方案3】:

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

    PS。我假设您要解析实际查询 $string,而不是生成将过滤问题中所述文本的正则表达式。

    【讨论】:

    【解决方案4】:

    我可以,而且我愿意,但是为了您的利益,我可以谦虚地建议您花 2 小时学习正则表达式教程吗?它会很快得到回报。

    【讨论】:

    • 我可以谦虚地承认我的大脑无法使用正则表达式 =) 吗?请帮忙,我保证我会为一个开源项目投入 2 个小时......
    • 投了赞成票。如果你是一名程序员,你会遇到很多很多次正则表达式。这是一个非常基本的问题。如果有人在这个级别“无法使用正则表达式”并且不想更改它,那么现在是考虑他们是否能够编程的好时机。
    • 请不要把它当成个人 :) 如果你真的在做编程,你很快就会写出比这更难的正则表达式,所以现在是开始学习它们的好时机 ;)
    • @Devrim 我的意思是不回答这个问题。我宁愿帮助你学会钓鱼,给你一条鱼。正则表达式教程将帮助您在 10 分钟内匹配单词,然后应用 Radomir Dopieralski 的解决方案。用剩下的 110 分钟来掌握它。您还可以通过使用 strpos() 检测匹配/否定匹配来完全避免正则表达式。
    • @louisgab 这不会结束,让我们在这里停下来。我是懒惰还是你根本不知道?如果每个 Java 问题都以“阅读 Java 书籍”来回答,或者将时间花在上大学,那么 obv stackoverflow 就不会存在。另一方面,有些人会放置可通过谷歌搜索轻松访问的愚蠢内容。我想我在正则表达式中问了一个特定问题,但你们接受了“我无法处理正则表达式”,老实说,我认为,你们无法解决这个特定问题——因为我擅长正则表达式。我知道像你这样的年轻人和 viraptor 吹嘘他们所知道的。一切都好。鱼就够了。
    猜你喜欢
    • 2017-08-17
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多