正则表达式判定a必须出现两次,出现一次或3次等都判定为false,请问怎么写?

比如校验字符串是否含有aa,只能是aa,且可以出现多次,如果字符串为a或者aaa,或aaaa等都判定为false,aa,aa判定为true我用(?!a)仍然无法判定

阅读 8.5k
3 个回答

/(?=^[^a]*aa(?![^a]*a))/

arr = [ 'a', 'aa', 'caab', 'caaab', 'aaa,aa' ]
ptn = /(?=^[^a]*aa(?![^a]*a))/
arr.filter(s => ptn.test(s))
//[ 'aa', 'caab' ]

补完~
如果用别的语言,很简单:
python3
'(?!^.*(?<!a)a(?!a))(?!^.*aaa)(?=^.*aa)'

import re
arr = [ 'a', 'aa', 'caab', 'caaab', 'aaa,aa' ]
print([s for s in arr if re.search(r'(?!^.*(?<!a)a(?!a))(?!^.*aaa)(?=^.*aa)',s)])
#['aa', 'caab']

但是js的re引擎是个半残疾~ 不能这么写。写函数简单点:
arr.filter(s=>/a/.test(s) && s.match(/a+/g).every(x=>x.length==2))

> arr = [ 'a', 'aa', 'caab', 'caaab', 'aaa,aa' ]
> arr.filter(s=>/a/.test(s) && s.match(/a+/g).every(x=>x.length==2))
[ 'aa', 'caab' ]
>
[^a]*aa[^a]*

上面的还是有问题,重新写一个:

(?<!a)aa(?!a)

验证一下:

$ echo '
a
aa
caab
caaab'|grep -P '(?<!a)aa(?!a)'
aa
caab

参考大神的正则改的,不知道还有没有问题

$ echo '
a
aa
caab
caaab
aaabaa
aaabaaa'|grep -P '^[^a]*(?<!a)aa(?!a)'
aa
caab

那aabaa这种true还是false?还是说整个字符串有且只能有一个"aa"?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进