问答

正则表达式匹配字符串中出现a,b,c三个字母各一次并且顺序任意

作者:admin 2021-05-09 我要评论

如题,今天突然想到这么个题目,没想出来答案。请大神们指教一下。 ### 正向写这个正则太恶心了,需要枚举6种排序方式.但是,如果把你的要求反过来看,就是不能达成...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

如题,今天突然想到这么个题目,没想出来答案。请大神们指教一下。

###

正向写这个正则太恶心了,需要枚举6种排序方式.但是,如果把你的要求反过来看,就是不能达成 abc三个字母必须出现且只能出现一次 的情况,就必然会满足以下的条件之一:

  • 没有出现 a
  • 没有出现 b
  • 没有出现 c
  • a 至少出现两次
  • b 至少出现两次
  • c 至少出现两次

只要出现以上的六种情况,那么必然就没有达成你的原始要求,那么正则如下:

^([^a]+|[^b]+|[^c]+|([^a]*a[^a]*){2,}|([^b]*b[^b]*){2,}|([^c]*c[^c]*){2,})$

ps. 这个正则如果匹配成功,就说明不符合要求

图示如下:
image.png

我不考虑字符串为空的情况哈,你要考虑自己加上.

###

一个正则太麻烦了,建议个组合判断,非要一个正则,就像下面这样麻烦

demo('abc') // true
demo('acb') // true
demo('bac') // true
demo('bca') // true
demo('cab') // true
demo('cba') // true
demo('cbab') // false
demo('cbabca') // false

function demo (str) {
  let res = /(^([^abc]*a[^abc]*[^abc]*b[^abc]*[^abc]*c[^abc]*)$)|(^([^abc]*a[^abc]*[^abc]*c[^abc]*[^abc]*b[^abc]*)$)|(^([^abc]*b[^abc]*[^abc]*a[^abc]*[^abc]*c[^abc]*)$)|(^([^abc]*b[^abc]*[^abc]*c[^abc]*[^abc]*a[^abc]*)$)|(^([^abc]*c[^abc]*[^abc]*a[^abc]*[^abc]*b[^abc]*)$)|(^([^abc]*c[^abc]*[^abc]*b[^abc]*[^abc]*a[^abc]*)$)/.test(str)
  console.log(str, '=>结果=>', res)
  return res
}

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • grom设置json默认值

    grom设置json默认值

  • Vue路由报错,看着没问题

    Vue路由报错,看着没问题

  • 思否邮箱登录为什么区分大小写了呢?

    思否邮箱登录为什么区分大小写了呢?

  • 有没有能够直接上传markdown文件作为博

    有没有能够直接上传markdown文件作为博

腾讯云代理商
海外云服务器