Javascript 正则表达式匹配集合中的1或2个字符,并确保它们';我们不一样
好了,伙计们,这是我的难题: 我希望使用vanilla JavaScript的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)
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]