检测回文的正则表达式
我在寻找一种特定类型的回文。它的规则是:
- 长度是5个字符;
- 前两个字符中,一个必须是大写字母,另一个必须是数字;
- 第三个字符是小写字母。
对我来说,主要的难点在于组引用的位置不确定。如果我写 '(((([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上查看这个表达式,并获得详细的解释。