【问题标题】:Match every Quoted String that DOES NOT contain a substring匹配每个不包含子字符串的引用字符串
【发布时间】:2010-01-06 07:21:26
【问题描述】:

多行测试字符串:

dkdkdkdk dkdkdkdk dkdkdkd dkdkdkd "hello" dkdkdkdkdk dkdkdk "goodbye.hello"  dkdkdkd kdkdkd kdkdkdk "hello.goodbye.hello" dddd "test" ssss "http:x-y.f/z/z" "" "."
"http:/dkdkd/dkdkdk/dkdkdkdkdkdk.g"

我想匹配每个包含“hello”的引号字符串

这匹配每个引用的字符串

\"(.+?)\"

这匹配每个包含 hello 的引用字符串

\"(.*?)hello(.*?)\"

但这并不匹配每个不包含 hello 的引用字符串

\"(.*?)(?!hello)(.*?)\"

感谢您的帮助!

【问题讨论】:

    标签: regex regex-negation


    【解决方案1】:

    我最初的答案是每次点匹配时都需要应用否定前瞻,如下所示:

    \"((?!hello).)*?\"
    

    但是,在包含多个带引号的字符串的目标中,此正则表达式存在问题——一个字符串的右引号和另一个引号的开始字符串之间的空格也是该表达式的“带引号的字符串”。

    因此,我的建议是使用简单的"[^"]*" 模式从您的目标中提取所有带引号的字符串,然后评估您想要禁止的单词的每个匹配项。

    【讨论】:

    • 最好使用"[^"]*" 而不是".*?"
    • @Gumbo 我看不出有什么不同?
    • @Daniel Vandersluis:它避免了不必要的回溯。
    【解决方案2】:

    试试这个

    \"((?!hello).)*?\"
    

    【讨论】:

    • 一开始我也是这么想的,但是因为有问题我把我的答案删了;在测试字符串中它不会匹配"hello",而是匹配" dkdkdkdkdk dkdkdk "
    • 最好使用"[^"]*" 而不是".*?"
    猜你喜欢
    • 2019-04-24
    • 2012-03-24
    • 2021-06-02
    • 2017-05-26
    • 2010-11-22
    • 2020-12-25
    • 1970-01-01
    • 2010-11-22
    • 2019-06-05
    相关资源
    最近更新 更多