Javascript 正则表达式匹配集合中的1或2个字符,并确保它们';我们不一样

Javascript 正则表达式匹配集合中的1或2个字符,并确保它们';我们不一样,javascript,regex,permutation,regexp-like,Javascript,Regex,Permutation,Regexp Like,好了,伙计们,这是我的难题: 我希望使用vanilla JavaScript的test()(一个RegExp原型的函数)匹配一个字符串,以测试输入变量inp: /{CONDITION}/.test(inp) 字符串必须满足以下条件: 它可以是一个或两个字符长。很简单 /^*{1,2}$/.test(inp) 它必须不区分大小写。没问题 /^*{1,2}$/i.test(inp) 如果只有一个字符,则必须仅由字符组成[tmbrcl] /^[tmblcr]{1}$/i.test(inp)

好了,伙计们,这是我的难题:

我希望使用vanilla JavaScript的
test()
(一个
RegExp
原型的函数)匹配一个字符串,以测试输入变量
inp

/{CONDITION}/.test(inp)
字符串必须满足以下条件:

  • 它可以是一个或两个字符长。很简单

    /^*{1,2}$/.test(inp)
    
  • 它必须不区分大小写。没问题

    /^*{1,2}$/i.test(inp)
    
  • 如果只有一个字符,则必须仅由字符组成
    [tmbrcl]

    /^[tmblcr]{1}$/i.test(inp)
    
  • 如果两个字符长,则第一个字符必须是
    [tmb]
    [lcr]
    ,第二个字符必须是第一个字符未设置的字符集。好:

示例:

't'   // Good
'B'   // Good
'Rc'  // Good
'bl'  // Good
'tb'  // bad
'mm'  // Bad
'cC'  // Bad
'BB'  // Bad
'Bob' // Bad
'5'   // Bad
'Ċ'   // Still Bad
'ß'   // Suspiciously Bad
'Your regex can be greatly shortened to this:

/^(?:[tmbrcl]|[tmb][rcl]|[rcl][tmb])$/i
't'//很好
“B”//很好
'Rc'//很好
'bl'//很好
'tb'//不好
“嗯”//糟透了
'cC'//坏的
'BB'//不好
“鲍勃”//糟糕
'5'//糟糕
'Ċ'//还是不好
“ß”//糟糕得令人怀疑

“您的正则表达式可以大大缩短为:

var r1 = /[abc]/i // notice the missing ^ and $ anchors
var r2 = /[def]/i
var r3 = /[ghi]/i
我认为这是一个足够好的解决方案。它读得很清楚:

在字符串的开始和结束之间,有三个选项:

  • [tmbrcl]
  • 一个
    [tmb]
    然后一个
    [rcl]
  • 一个
    [rcl]
    然后一个
    [tmb]
实际上,您并不需要所有这些
{1}
s

编辑:

我不知道你问的是更多套的箱子。那样的话,我认为你应该采用另一种方法

一种方法是:

  • 每个集合有一个正则表达式:

    var regexes = [r1, r2, r3]
    
  • 将它们全部放在一个数组中

  • 循环遍历数组并计算有多少正则表达式与字符串匹配

  • 与字符串匹配的正则表达式的数量应等于字符串的长度

  • 请注意,这假设您的集合不相交。

    我明白了。使用非捕获组作为一种操作顺序,首先评估内部组。没错。但是,这是否意味着,在相同的场景下,但有3个字符,跨越三个潜在组(称为
    abc
    def
    ghi
    ),并允许1、2或3个字符(不重复,每组一个),我正在查看/^(?[abcdefghi][abc][def][abc][ghi][def][ghi][def][ghi][ghi][abc]|[abc][def][ghi]|[abc][ghi][def][abc][ghi]|[def][ghi][abc]|[ghi][abc][def]|[ghi][def][abc])$/i@ZenAtWork我在另一个解决方案中进行了编辑。我不知道你问的是更多的集合。我对此很了解。好吧,这两个都回答了我的问题,优化了我最初笨拙的尝试,并清楚地告诉我,在处理更大的子集时,正则表达式不一定是唯一正确的工具(参见:用香蕉给自行车轮胎充气)。感谢您的及时回复;已选择答案。
    var regexes = [r1, r2, r3]