regex 在包含某些字母和数字的字符串中不允许三个或更多连续数字

7vux5j2d  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(117)

我试图找到一种方法来使用RegEx来匹配字符串中包含某些字符的字符串。例如,我想匹配包含字母ABC以及数字123的所有字符串。它们可以在字符串上的任何地方,字母可以出现零次或多次,而数字不能连续出现3次或多次。
在这些条件下,字符串A3BC21BBC11CCAB22C31CCCAAA将匹配,但111AG05T47ABC不会匹配。
我甚至不知道从哪里开始,因为我见过的每一个RegEx都遵循你想要匹配的字符串的结构,但我从来没有见过一个例子,你要找的模式在字符串上的任何地方。
我试过这样幼稚的事情

^[ABC]+[123]{0,2}$

但这显然不会返回匹配,因为字母必须首先出现。
我还尝试了捕获组:

^([ABC]+|[123]{0,2})$

它要么匹配具有字母模式的字符串,要么匹配具有数字模式的字符串,但不能同时匹配两者。
我也试过正面的形象:

^[ABC]+(?=[123]{0,2})$

但当然,这也不管用我该怎么办?

c8ib6hqw

c8ib6hqw1#

你可以使用类似于:

/^(?!.*\d{3})[ABC]*[123][ABC123]*$/gm
  • /^-起始点,起始行锚
  • (?!.*\d{3})-确保一行中没有三个或更多的数字
  • [ABC]*[123][ABC123]*-尽可能多次捕获A、B、C、1、2或3,但确保1、2或3出现一次或多次
  • $-端线锚
  • /gm-应用全局和多行标志

https://regex101.com/r/Wq85Lu/1

slmsl1lt

slmsl1lt2#

你不能只是验证整个表达式的所有法律的字符,然后检查一个数字序列的最大长度吗?这将需要两个表达式检查。
我将测试以下内容:

  • 匹配:/^[ABC123]+$/
  • 不匹配:/\d{3}/g
const isValid = (s) => /^[ABC123]+$/.test(s) && !/\d{3}/g.test(s);

// All valid?
console.log(['A3BC21', 'BBC1CC', 'AB22C31CCAAA'].every(isValid));

// All invalid?
console.log(!['111A', 'G05T', '47ABC'].some(isValid));
uinbv5nw

uinbv5nw3#

^
  (?!.*           does not contain anywhere
    \d\d\d        three digits is a row
  )
  [ABC123]+       consists of ABC123
$
/^(?!.*\d\d\d)[ABC123]+$/
bfnvny8b

bfnvny8b4#

这可能不应该是一个正则表达式
regex表达式可以识别不匹配项(包含不允许的字符)
这也覆盖A、B、C零次或多次
现在你只剩下数字显示...
如果你画出每个数字上出现一次、两次和三次的排列,你会发现任何你能想到的可能工作的表达式都很难维护,而且可能会有运行时性能问题--即,正则表达式可能没有意义,
相反,计算“1”出现的次数,如果在[1,3]中,则继续计算2,然后计算3

相关问题