【问题标题】:Boost/Perl Regex Look behind containing ORBoost/Perl Regex 查看包含 OR
【发布时间】:2017-09-03 13:15:38
【问题描述】:

我正在尝试使用look-behind来检查前面的元素是空格还是字符串开头:

(?<=^|\s)

这在regex101 上运行良好,风格设置为PHP,但在boost(我相信是Perl)下会出现语法错误。我认为是^ 导致了这个问题。我找不到任何文档来说明为什么会这样,我们将不胜感激。

【问题讨论】:

  • 你的问题我不清楚,请提供一些样本和预期结果-HTH ;)。
  • libboost 支持多种正则表达式,你确定选择好的吗?不管怎样,libpcre 和 libboost perl 兼容的正则表达式风格(比如这个)之间存在细微差别。顺便说一句,一个很好的解决方法是(?&lt;!\S) 来处理这两种情况。对于更复杂的情况,没有什么禁止写(?:(?&lt;=sub1)|(?&lt;=sub2)|...)
  • 您是否使用常规字符串文字声明模式?使用双反斜杠。如果是原始字符串文字,请使用单个。 "(?&lt;=^|\\s)"R"((?&lt;=^|\s))"
  • 感谢您的帮助。似乎你不能直接在后面使用 or 语句。 Casimir:你的解决方案是我最终的结果,谢谢!只是看起来有点啰嗦。

标签: regex boost pcre


【解决方案1】:

应该能够在 boost 的后视中使用 |,但每个替代项必须具有相同(固定)长度。

  • ^ 是一个断言,因此长度为 0
  • \s 只匹配一个字符,所以它的长度是 1。

PCRE 放宽了这个限制:每个替代项仍然必须是固定长度,但现在它们不一定需要等长。

这是PCRE docs中的相关行:

(a) 虽然 PCRE2 中的后向断言必须匹配固定长度的字符串,但后向断言的每个替代分支都可以匹配不同长度的字符串。 Perl 要求它们都具有相同的长度。

确实,如果你尝试,Perl 会输出以下错误:

$ perl -e 'm#(?<=^|\s)#'
Variable length lookbehind not implemented in regex m/(?<=^|\s)/ at -e line 1.

现在,至于解决方案,您需要找到解决方法。我将在这里引用Casimit et Hippolyte's comment

顺便说一句,(?&lt;!\S) 可以处理这两种情况。对于更复杂的情况,没有什么禁止写(?:(?&lt;=sub1)|(?&lt;=sub2)|...)

【讨论】:

  • 感谢大家提供的信息
猜你喜欢
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多