【问题标题】:Regex match Just Once (no repetition)正则表达式匹配一次(不重复)
【发布时间】:2014-09-26 00:16:45
【问题描述】:

我正面临这个小正则表达式问题(标志:全球)

[-+*&|]

这意味着匹配例如这个表达式中的+,而不是++或--:

12 + 47 - i++ / --foo

但是它匹配它们。

我知道这个解决方案,但它很丑(需要重复三次):

[^-+*&|][-+*&|][^-+*&|]

或许

(?<![-+*&|])([-+*&|])(?![-+*&|])

有更好(更短、更易读)的解决方案吗?

【问题讨论】:

  • @AvinashRaj 我不想匹配 ++ 和 --。
  • @MightyPork 在++ 中甚至没有+
  • 当然不是,是不同的算子。我只想要独立的 + 和 -。
  • 这不是常规语言。虽然您可以将它与 Python(或 Perl 等)正则表达式匹配,但这并不意味着您应该这样做;一旦你开始使用前瞻和后瞻,你很容易陷入指数级爆炸。此外,你的规则,无论你做得多么漂亮,都将无法匹配12+-3,我认为这在你的语言中是完全有效的。那么……为什么不使用简单的 OP 解析器而不是正则表达式呢?
  • 不能减少比这更多的(?&lt;![-+*&amp;|])([-+*&amp;|])(?!\1)

标签: python regex


【解决方案1】:

这对我来说似乎更具可读性,但不是很多。

(?<![\+\-\*/\&\|])(?P<operator>[\+\-\*/\&\|])(?!(?P=operator))

匹配:

+ ++ - -- * ** / // & && | ||
^    ^    ^    ^    ^    ^

【讨论】:

    【解决方案2】:
    [-+*&|]{1,3}
    

    您可以使用{min,max} 来定义最小和最大出现次数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-06
      • 2012-10-31
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      相关资源
      最近更新 更多