我正在寻找一种特殊的回文。规则是
对我来说,主要的困难是群体参考的未确定位置。
如果我写'(((([A-Z])([0-9]))|(([0-9])([A-Z])))[a-z]\5\4)'
,则只会匹配K2i2K
但不会2KiK2
。要匹配2KiK2
,我必须写'(((([A-Z])([0-9]))|(([0-9])([A-Z])))[a-z]\8\7)'
。
那么我应该如何编写正则表达式?谢谢。
答案 0 :(得分:4)
\b(?=.{5})(?=(?:[A-Z]\d|\d[A-Z]))(.)(.)[a-z]\2\1\b
这断言(正面预测)有5个字符,前两个字母是Capital-Digit或Digit-Capital对。
一旦我们确定了这一点,其余的都是微不足道的。我们捕获前两个字符,检查小写字母,然后按相反的顺序匹配前两个捕获。
我还使用单词边界(\b
)包围正则表达式,以确保它在单词的中间不匹配。
在Regex101上查看并附上详细说明。
答案 1 :(得分:2)
我想说让你的生活变得简单,只需使用一个简单的替换方案:
([A-Z])([0-9])[a-z]\2\1|([0-9])([A-Z])[a-z]\4\3
这会查找A-Z
,0-9
,a-z
,0-9
,A-Z
或0-9
,A-Z
,{ {1}},a-z
,A-Z
。虽然您可能认为它会受到性能影响,但它确实不应该。它将匹配0-9
并尝试转到第一条路线(如果它在任何时候失败,它将尝试匹配A-Z
并失败并增加一步)或者在0-9
失败并且尝试从A-Z
开始匹配。无论哪种方式,它只能在成功/失败方面有一个额外的步骤。