【问题标题】:Capture , if between substring ""捕获,如果在子字符串“”之间
【发布时间】:2014-08-31 14:13:36
【问题描述】:
(?!([^"]*"[^"]*")*[^"]*$),

这捕获,如果它在“”之间。假设测试字符串是

 1 2 3 4 , 5 6 7, 8 9 "10 11 12 , 13 14 15," 16,17,"18,19,"20 21,22

捕获的时间将在 12 到 13 岁之间,休息时像

  http://regex101.com/r/rX0dM7/1

现在如果我将相同的更改为

(?!(.*?".*?")*[^"]*?$),

这仅捕获结束,在 18 和 19 之间。类似于

  http://regex101.com/r/hL7uS1/1

现在的问题是为什么 [^"] 与 .* 如此不同?" .

其次,[^"]*$ 的意义是什么,好像我删除它什么都没有被捕获。

【问题讨论】:

    标签: regex regex-negation


    【解决方案1】:
    • [^"]*" 匹配任意数量的字符除了引号,后跟引号。
    • .*?" 匹配任意数量的字符,包括引号,后跟引号。

    现在第二个正则表达式中的? 使* quantifier 变得懒惰,这意味着它要求它很好地匹配尽可能少的字符以使匹配发生。因此,在字符串abc"def" 中,两个正则表达式将匹配相同的文本。到目前为止,一切顺利。

    现在的问题是,您已经将该正则表达式包含在 negative lookahead assertion 中,它必须确保其中的正则表达式 不可能 匹配。由于点 可能 也匹配一个引号,如果它必须匹配,它会这样做以使匹配成为可能,这将导致前瞻失败,除非字符串中只剩下两个引号.

    对于第二个问题,[^"]*$ 确保字符串末尾允许出现除引号之外的其他字符。

    【讨论】:

    • 你的意思是说 .*?" 也会匹配 "?它会跳过第一个“”来匹配第二个“”吗?当我删除第二部分时,为什么没有匹配?
    • 是的,是的,你读过我回答的最后一句话吗(请记住,我们处于否定的前瞻中,所以如果我们删除字符串结尾的锚点,我们就不需要正则表达式检查整个字符串是否匹配)?
    • 如果我删除 $ 或 [^"]*$,那么它什么都不匹配:(
    • 我现在得到了所有东西,但唯一剩下的就是如何才能.*?跳过“ tp match the end”。它是这样设计的吗?它是否记录在某个地方?从概念上讲它不应该跳过吗?
    • 例如第一个.*?可以匹配' 13 14 15,"',第二个匹配' 16,17,"18,19,"'(这是可能的,因为.可以匹配"),那么[^"]*?$匹配@987654335 @,这会导致前瞻失败 - 因此 1213 之间的逗号不匹配。
    【解决方案2】:

    从概念上讲,我认为您的想法不正确。

    Lookarounds 以当前搜索 Position 的位置为中心。

    在您的前瞻中,您甚至在表达式找到逗号之前就已经与表达式中的逗号进行了否定匹配。

    这称为重叠。

    前瞻通常在匹配的子表达式被消耗后插入,位置
    增加,然后检查断言。

    同样,Lookbehinds 通常位于对象子表达式之前。

    所以,你的正则表达式实际上就是这个

     ,
     (?!
          ( [^"]* " [^"]* " )*
          [^"]* $ 
     ) 
    

    当你这样做时,你可以很容易地看到删除[^"]*$后 这个( [^"]* " [^"]* " )* 匹配字符串中的每一点。
    因为它是可选的。

    如果你把它改成( [^"]* " [^"]* " )+ 那么它会找到
    一些具体的负面匹配。
    $ 之前就是为这个目的服务的。

    希望您现在有更好的理解。

    【讨论】:

    • Thanx 但是当我们将 [^"]* 替换为 .*? 时会出错。我正在努力理解这一点。你能解释一下吗
    • 对不起,不知道你是新手。与 [^"] 相比,点元字符表示 [^\n]。这就是原因。类是基本的正则表达式构造。我建议从那里开始阐明它。
    • 是的,我正在学习所有这些。我的主要问题是 [^"]* 和 (.*?)"。当我们稍后使用时,它如何匹配“当它设置为惰性选项时.当它第一次遇到“它应该停止。那是我的担心
    • 没有必要把事情复杂化。它只会让你感到困惑。 'lazy' 量词的行为可以被覆盖并暂时变得贪婪。引擎会自动执行此操作。它在这里展示 -> .*?"(?<!a") 仅匹配 aa"ccc"。没有其他匹配,所以引擎别无选择。尽量不要被懒惰的量词所愚弄,我们真的,在使正则表达式只是 Suggest 东西给引擎。当你将来成为一个禅师时,你可以像手术刀一样使用正则表达式,直到那个时候继续练习。
    猜你喜欢
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2018-03-05
    相关资源
    最近更新 更多