Regex 捕获,如果在子字符串“”之间

Regex 捕获,如果在子字符串“”之间,regex,regex-negation,Regex,Regex Negation,如果介于之间,则捕获。假设测试字符串为 (?!([^"]*"[^"]*")*[^"]*$), 被捕获的人将在12到13岁之间,其余的人都是这样 1 2 3 4 , 5 6 7, 8 9 "10 11 12 , 13 14 15," 16,17,"18,19,"20 21,22 现在,如果我将相同的更改为 http://regex101.com/r/rX0dM7/1 这只捕捉到了结尾,介于18到19之间 (?!(.*?".*?")*[^"]*?$), 现在的问题是为什么[^]与。*?

如果介于之间,则捕获。假设测试字符串为

(?!([^"]*"[^"]*")*[^"]*$),
被捕获的人将在12到13岁之间,其余的人都是这样

 1 2 3 4 , 5 6 7, 8 9 "10 11 12 , 13 14 15," 16,17,"18,19,"20 21,22
现在,如果我将相同的更改为

  http://regex101.com/r/rX0dM7/1
这只捕捉到了结尾,介于18到19之间

(?!(.*?".*?")*[^"]*?$),
现在的问题是为什么[^]与。*?如此不同

第二,[^]*$的意义是什么?如果我删除它,则不会捕获任何内容

[^]*匹配除引号外的任意数量的字符,后跟引号。 .*? 匹配任意数量的字符,包括引号,后跟引号。 现在呢?在第二个示例中,正则表达式使*变懒,这意味着它要求尽可能少地匹配字符,以实现匹配。因此,在字符串abcdef中,两个正则表达式将匹配相同的文本。到目前为止,一切顺利

现在的问题是,您已经将正则表达式封装在一个函数中,该函数必须确保其中的正则表达式不可能匹配。由于点也可能在必要时匹配引号,因此它会这样做以使匹配成为可能,这将导致前瞻失败,除非字符串中只剩下两个引号


对于您的第二个问题,[^]*$确保允许在字符串末尾显示除引号以外的其他字符。

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

环顾四周以当前搜索位置为中心

在前瞻中,在表达式中找到逗号之前,您正在对其进行负匹配

这称为重叠

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

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

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

  http://regex101.com/r/hL7uS1/1
当您执行此操作时,您可以在删除[^]后很容易地看到*$ 此[^]*[^]**匹配字符串中的每个点。 因为它是可选的

如果将其更改为[^]*[^]*+则会发现 一些具体的东西来反对。 美元以前就是为了这个目的


希望你现在有更好的了解

你是说*?我也要比赛吗?它会跳过第一个来匹配第二个吗?当我删除第二部分时,为什么没有匹配项?是的,是的,你读过我答案的最后一句话了吗,记得我们在一个负前瞻中,所以如果我们删除字符串结束锚,我们就不需要正则表达式来检查整个字符串是否匹配?如果我删除$或[^]*$,然后它就什么都不匹配了:我现在什么都有了,但剩下的唯一一件事是我怎么能做到?跳过tp匹配结尾。它是这样设计的吗?它是否有文档记录?从概念上讲,它不应该跳过右键?例如,第一个。*?可以匹配'131415',第二个匹配'16,17,18,19',这是可能的,因为。can match,那么[^]*?$匹配'20 21,22',这会导致前瞻失败-因此12和13之间的逗号不匹配。Thanx但是当我们用[^]*替换为*时?出了问题。我在努力理解。你能不能解释一下呢?我不知道你是个新手。与[^]相比,点元字符表示[^\n]。这就是为什么。类是一个基本的正则表达式构造。我建议从这里开始了解它。是的,我正在学习所有这些。我的主要问题是[^]*和。*?。当我们以后使用时,当它设置为懒惰选项时,它如何匹配。当它第一次遇到它时,它应该停止。这是我的担忧。没有必要将事情过度复杂化。这只会让你困惑。“懒惰”量词的行为可以被覆盖,并被设置为暂时贪婪。发动机自动执行此操作。它在这里展出->*??
 ,
 (?!
      ( [^"]* " [^"]* " )*
      [^"]* $ 
 )