正则表达式引用语音

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

"(?P<quote>.+?(?<![^\\]\\))"

在上面的https://regex101.com/r/NVjtW4/1上可以正常使用。

但是,我想知道是否还可以使用其他“技术”来提取引用的文本。也许有以下限制:

  • 不使用.+?
  • 不用在后面使用负数(可能是否定的字符类)。

基本上,我的问题不是,“做这件事的一种方法是什么?”,而是“可能还有其他选择”,因此我看到解决我的问题的不同可能方法就像是一个困难而棘手的正则表达式。工艺(逃避一个\而不逃避两个\\等)

此外,我想检查引号前是否存在奇数个转义符:

".*?(?<=(\\{2})*)"

但这给我一个"* A quantifier inside a lookbehind makes it non-fixed width"的错误。我的另一个是:

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

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

wangzywangzy 回答:正则表达式引用语音

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

See regex in use here

"(?<quote>(?:[^"\\]|(?:\\["\\])*)*)"

其工作原理如下:

  • (?:[^"\\]|(?:\\["\\])*多次匹配以下任一选项
    • [^"\\]-选项1:匹配\"之外的任何字符
    • (?:\\["\\])*-选项2:匹配\后跟\",任意次数
      • 这与以下情况\\\\\\\\\\\\等以及\"\\\"\\\\\"等匹配。
      • 如果您希望它也匹配\a之类的情况,请将\\["\\]更改为\\.

lookbehind问题(给您错误"* A quantifier inside a lookbehind makes it non-fixed width")是因为您使用的正则表达式引擎不允许变量lookbehinds。

某些正则表达式引擎确实允许这样做(例如.NET的正则表达式引擎),但大多数不支持此功能(例如PCRE不支持此功能)。为了解决这个问题,某些正则表达式引擎允许使用令牌\K,该令牌可让您重置匹配项(?:\\{2})*\K

本文链接:https://www.f2er.com/3149049.html

大家都在问