【问题标题】:Regex for quoted speech引用演讲的正则表达式
【发布时间】:2019-11-06 20:40:58
【问题描述】:

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

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

在上面运行正常:https://regex101.com/r/NVjtW4/1

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

  • 不使用.+?
  • 不使用否定的lookbehind(可能是否定字符类)。

基本上,我的问题不是“唯一的方法是什么?”,而是“可能有哪些其他选择”,所以我可以看到不同的可能方法来解决我觉得困难和棘手的正则表达式工艺(逃脱一个\,但不是两个\\等)

另外,我想检查一下引号之前是否有奇数个转义:

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

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

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

但这也不匹配转义引号。

【问题讨论】:

标签: regex


【解决方案1】:

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

See regex in use here

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

它的工作原理如下:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多