【问题标题】:Regex to match possibly-escaped quotes正则表达式匹配可能转义的引号
【发布时间】:2013-03-04 21:54:12
【问题描述】:

我正在尝试编写一个正则表达式来匹配单引号,这可能会被转义。匹配的引号前面应该有偶数个反斜杠(奇数表示引号被转义)。例如,在这五个字符串中:

'quotes should be matched'
\'quotes should NOT be matched\'
\\'quotes should be matched\\'
\\\'quotes should NOT be matched\\\'
\\\\'quotes should be matched\\\\'

这是我拥有的正则表达式:

(?<=[^\\](?:\\\\)*)'

但是,这与上述示例中的任何内容都不匹配。我觉得这很奇怪,因为从正则表达式中删除 * 与带有两个反斜杠的引号匹配,因为它应该:

(?&lt;=[^\\](?:\\\\))' 匹配 \\'

【问题讨论】:

  • Regex 通常不是这样匹配的最佳工具
  • 在我的情况下我真的别无选择。只是出于好奇,我的替代方案是什么?
  • 您使用哪种编程语言?
  • 当您添加 * 时它不起作用,因为该部分在您的后视中,并且大多数正则表达式引擎不支持可变长度后视(即,不能包含像 @987654327 这样的量词@、*+{n,m})。
  • @Joel 这取决于很多因素;就像如果这是一个 CSV 文件,可能已经有一个 CSV 解析器内置到您使用的任何语言中。如果它是一个独特的数据集,您可能必须创建自己的解析器。

标签: php regex escaping


【解决方案1】:

据我所知,不可能只匹配'。这是因为您不能像 Wiseguy 指出的那样进行动态长度后视。

以下正则表达式将匹配正确的' 和任何\s 导致它但是。不确定这是否有用..

(?<!\\)(?:\\\\)*'

匹配任意数量的双 \s,前面没有 \,后面跟着 '

【讨论】:

  • 您可以使用\K 模拟可变长度的后视。 (?&lt;!\\)(?:\\\\)*\K' 仅匹配 'regexr.com?340ef
猜你喜欢
  • 1970-01-01
  • 2011-09-25
  • 2010-10-16
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多