【问题标题】:Match substrings of same length using regexp使用正则表达式匹配相同长度的子字符串
【发布时间】:2012-12-15 05:29:24
【问题描述】:

我有一个类似于寻找“匹配括号”的挑战,但我想这是一个更简单的挑战。 例如,像“xAAAyBBBz”这样的字符串应该匹配,因为有 3 个 A 和 3 个 B。然而,“xAAyBBBz”不应该匹配,因为有一个“不匹配的”B。字符串有任意长度,它应该是一个单一的正则表达式。我可以使用正则表达式中的评估(毕竟是 Perl),我可以(应该!)完全避免正则表达式。但现在我开始好奇了。

【问题讨论】:

标签: regex perl


【解决方案1】:
^[^AB]*(A(?:[^AB]*|(?-1))B)[^AB]*\z

^
[^AB]*       # "x"
(
  A
  (?:
    [^AB]*   # "y"
  |
    (?-1)
  )
  B
)
[^AB]*       # "z"
\z

捕获组(A(?:[^AB]*|(?-1))B) 匹配开头的A 和结尾的B。在这两者之间,可能有任意数量的非(AB)字符,或者第一个捕获组的模式可能在此位置递归匹配((?-1))。这保证了As 和Bs 是平衡的。

【讨论】:

  • @melpomene 答案通常应附有解释。即使某些事情对你来说似乎很明显,但对其他人来说可能不是。
  • 我知道这就是你问的原因。我之前的评论仍然有效。
  • @melpomene 我原以为这很明显。我发表评论是因为您的回答缺乏解释。这是关于如何改进答案的建议。这是一个学习环境,人们来这里学习新事物,这就是为什么解释很重要。
  • 哦,我想你会的。如果没有,你会比新手破译你​​的正则表达式更容易。
  • @melpomene:非常感谢您的精彩提示,但是,我建议您指出 (?-1) 是您魔法的 prestige 部分;)@amon:感谢您提供解释!
猜你喜欢
  • 2015-04-02
  • 2018-02-03
  • 1970-01-01
  • 2012-03-02
  • 2011-11-08
  • 2022-07-11
  • 2011-12-22
  • 1970-01-01
  • 2019-01-04
相关资源
最近更新 更多