Regex 引述演辞的正则表达式

Regex 引述演辞的正则表达式,regex,Regex,我提出了以下正则表达式,以便能够从文本中提取引号: "(?P<quote>.+?(?<![^\\]\\))" 但是这给了我一个错误,“*一个在lookback中的量词使它成为非固定宽度”。另一个是: "[^((\\{2})*")]+" 但这也与转义引号不匹配。这可以在不使用惰性量词和lookbehind的情况下完成: “(?(?:[^”\\].*)” 这项工作如下: (?:[^“\\]\;(?:\\[“\\])*多次匹配以下任一选项 [^“\\]-选项1:匹配除\或

我提出了以下正则表达式,以便能够从文本中提取引号:

"(?P<quote>.+?(?<![^\\]\\))"
但是这给了我一个错误,
“*一个在lookback中的量词使它成为非固定宽度”
。另一个是:

"[^((\\{2})*")]+"

但这也与转义引号不匹配。

这可以在不使用惰性量词和lookbehind的情况下完成:

“(?(?:[^”\\].*)”
这项工作如下:

  • (?:[^“\\]\;(?:\\[“\\])*
    多次匹配以下任一选项
    • [^“\\]
      -选项1:匹配除
      \
    • (?:\\[“\\])*
      -选项2:匹配
      \
      ,后跟
      \
      ,任意次数
      • 这与下列情况相匹配:
        \\\\
        \\\\\\
        \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/code>、
        \\\\\\\\\\\\\\\\\\\\\/code>等
      • 如果您希望它也匹配像
        \a
        这样的情况,请将
        \\[“\\\]
        更改为
        \\。

lookbehind的问题(给您一个错误,
“*lookbehind中的量词使其成为非固定宽度”
)是因为您使用的正则表达式引擎不允许变量lookbehind

一些正则表达式引擎允许这样做(例如.NET的正则表达式引擎),但大多数不支持这样做(例如PCRE不支持)。为了避免这种情况,一些正则表达式引擎允许使用令牌
\K
,允许您重设匹配
(?:\\{2})*\K

还有一个类似的正则表达式。可能是最有效的模式。
"[^((\\{2})*")]+"
"(?<quote>(?:[^"\\]|(?:\\["\\])*)*)"