检测回文的正则表达式

1 投票
2 回答
2840 浏览
提问于 2025-04-18 15:58

我在寻找一种特定类型的回文。它的规则是:

  1. 长度是5个字符;
  2. 前两个字符中,一个必须是大写字母,另一个必须是数字;
  3. 第三个字符是小写字母。

对我来说,主要的难点在于组引用的位置不确定。如果我写 '(((([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)'

那么我应该怎么写这个正则表达式呢?谢谢。

2 个回答

2

我建议你让自己轻松一点,直接用简单的方式来处理这两种情况:

([A-Z])([0-9])[a-z]\2\1|([0-9])([A-Z])[a-z]\4\3

示例


这个方法会查找大写字母(A-Z)、数字(0-9)、小写字母(a-z),还有大写字母和数字的组合。虽然你可能觉得这样做会影响性能,其实并不会。它会先尝试匹配大写字母(A-Z),如果在某个步骤失败了,它会再尝试匹配数字(0-9),这时候只多了一步。或者,它也可能先在数字(0-9)上失败,然后再尝试匹配大写字母(A-Z)。无论哪种情况,成功或失败时最多只会多一步。

4
\b(?=.{5})(?=(?:[A-Z]\d|\d[A-Z]))(.)(.)[a-z]\2\1\b

这个表达式使用了一种叫做“正向前瞻”的技巧,确保有5个字符,并且前两个字符要么是大写字母加数字,要么是数字加大写字母的组合。

一旦确认了这些条件,后面的部分就简单了。我们先抓取前两个字符,然后检查是否有小写字母,最后再反向匹配前两个抓取的字符。

我还在正则表达式的两边加上了单词边界(\b),这样可以确保它不会在一个单词的中间匹配。

你可以在Regex101上查看这个表达式,并获得详细的解释。

撰写回答