否定正则表达式中的反向引用

Yuv*_* A. 41 regex backreference negate regex-group

如果字符串具有此预测格式:

value = "hello and good morning"
Run Code Online (Sandbox Code Playgroud)

其中"(引用)也可能是'(单引号),而结束字符('或")与开头字母相同.我想匹配引号之间的字符串.

\bvalue\s*=\s*(["'])([^\1]*)\1
Run Code Online (Sandbox Code Playgroud)

(这两个是允许=符号附近的任何空格)

第一个"捕获的组"(在第一对括号内) - 应该与开头的引号匹配,后者应该是'或'然后 - 我应该允许任何数量的字符不是第一组中捕获的字符,然后我期待在组中捕获的字符(括号引号).

(必须在第二个捕获组中捕获所需的字符串).
但这不起作用.

这样做:

\bvalue\s*=\s*(['"])([^"']*)["']
Run Code Online (Sandbox Code Playgroud)

但我想确保开始和结束引号(双重或单引号)是相同的.


编辑
目标基本上是获取一个锚的开始标记,该锚具有包含在其类属性中的某个类名,我想要涵盖类属性的罕见情况,包括(')或().

根据这里的所有建议,我使用了以下模式:

<\s*\ba\b[^<>]+\bclass\s*=\s*("|'|\\"|\\')(?:(?!\1).)*\s*classname\s*(?:(?!\1).)*\1[^>]*>
Run Code Online (Sandbox Code Playgroud)

含义:
找一个标记 - 开放标志.
允许任何空格.
找到单词 a.
允许任何非关闭标记.
找到"class(任何空格)=(任何空格)"
获取开场引号,以下之一:("或'或\"或\').
来自Alan Moore的回答:允许任何不是开头报价的字符.
find classname
允许任何不是开头引号的字符.
找到与开头相同的收盘价.
允许任何unclosing-tag字符.
找到结束标记char.

Ala*_*ore 60

而不是否定的字符类,你必须使用否定的前瞻:

\bvalue\s*=\s*(["'])(?:(?!\1).)*\1
Run Code Online (Sandbox Code Playgroud)

(?:(?!\1).)*在前瞻确认角色不是捕获组匹配的任何角色,一次消耗一个角色,(["'']).一个否定或不否定的字符类一次只能匹配一个字符.就正则表达式引擎而言,\1可以表示任意数量的字符,并且没有办法说服\1它只包含"'在这种情况下.因此,您必须使用更通用(且不太可读)的解决方案.

  • 负向前瞻,`(?!\1)`,实际上并不匹配任何东西,它只是断言不可能*在当前位置匹配`\1`。实际上匹配(即*消耗*)下一个字符的是`.`。 (2认同)
  • 至于非捕获组,这只是政策; 我使用它是因为我没有*必须*在那里使用捕获组.我发布的正则表达式应该以任何一种方式工作,尽管`((?!\ 1).)*`将是无效的低效率.更重要的是,组根据它们在正则表达式中的位置进行编号,因此尽可能使用非捕获组可以更容易地跟踪捕获组编号. (2认同)