【问题标题】:c++11 regex lookahead exclude wordc++11正则表达式前瞻排除单词
【发布时间】:2017-07-04 14:19:17
【问题描述】:

我有一个字符串列表:

  1. 参考价格
  2. 参考当前价格
  3. 成本价格
  4. 平均成本价格 ...

我想过滤掉所有符合以下条件的字符串:

  1. 包含“价格”,
  2. 但不包含“CostPrice”

我的正则表达式是'(?!Cost)Price',但它可以匹配第三个字符串'CostPrice',为什么?什么是正确的正则表达式?


经过一番调查,我知道“前瞻”是什么意思。它的意思是向右看,所以类似地向后看的意思是向左看

正确的正则表达式应该是否定的后向正则表达式:

(?<!Cost)Price

试试看:https://regex101.com/r/m3238r/1

很遗憾,c++11 不支持后视。 Boost 正则表达式可以。 http://www.boost.org/doc/libs/1_50_0/libs/regex/doc/html/boost_regex/syntax/perl_syntax.html

【问题讨论】:

  • 你需要一个“向后看”,而 C++11 显然不支持。
  • @ClasG 是否可以在我的情况下使用 c++11 正则表达式?

标签: regex c++11


【解决方案1】:

必须尽快采取行动,我会用一个(在我看来)愚蠢的解决方案来回答(肯定有更好的解决方案:P)。

((?!Cost)....|^.{0,3})Price

如果前面有 4 个字符(至少),请确保它不是 Cost。或者,确保Price 前面的字符不超过 3 个。

See it here at regex101.

【讨论】:

  • 很好的解释和文档。谢谢。不知道有没有更好的。
  • 可以简化为 ((?!Cost).{4}|^.{0,3})Price :-)
  • @user1633272 是的。这使它的性能更好,但 imo,当正则表达式的长度没有缩短时,.... 更容易阅读/理解。
猜你喜欢
  • 2014-02-16
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 2015-09-13
相关资源
最近更新 更多