如何管理regex中的重复字符



我使用这个正则表达式来查找数组中出现的以下所有事件:

/^.*(?=.*T)(?=.*O)(?=.*T)(?=.*A).*$/

它与匹配

pOTATO
mATTO
cATeTO

还有

lATO
minAreTO
AnTicO

尽管最后三个单词只有一个T

如何只提取至少包含两个Ts的单词,一个A,一个O,按任何顺序?

由于环视法站稳了脚跟,一旦第一次环视被尝试,下一次环视以及第一次环看后的所有后续环视都会从完全相同的位置进行检查。

你需要使用

/^(?=.*T.*T)(?=.*O)(?=.*A).*/
/^(?=.*T[^T]*T)(?=.*O)(?=.*A).*/

请注意^之后缺少.*,这是不必要的,因为只在字符串起始位置激发lookahead一次就足够了。现在,(?=.*T.*T)确保有两个零个或多个字符的重复,而不是尽可能多的换行字符,后面跟着一个T字符。(?=.*T[^T]*T)确保尽可能多地存在除换行符以外的零个或多个字符,然后是T,除T之外的零个以上字符,然后又是另一个T

请参阅regex演示#1和regex演示#2。注意,(?=.*T[^T]*T)可以与(?=.*T.*T)匹配更多,因为[^T]可以与换行符匹配。为了避免在演示中出现这种情况,我在否定字符类中添加了n

最新更新