我正在尝试在javascript中编写正则表达式,以验证字符串是否为有效的jquery选择器。这完全是教育性的,不是我的任何项目中的特定要求
模式
/^(\$|Jquery)\(('|")[\.|#]?[a-zA-Z][a-zA-Z0-9!]*('|")\)$/gi
在以下测试中效果很好
$("#id")//true
$('.class')//true
jquery('.class')//true
jquery('div')//true
我的问题是$('#id")
上的测试也返回true,即在js中使用单引号和双引号混合使用无效。如何限制这一点。我们可以有条件的正则表达式吗?
const pattern = /^(\$|Jquery)\(('|")[\.|#]?[a-zA-Z][a-zA-Z0-9!]*('|")\)$/gi;
[
`$("#id")`, //true
`$('.class')`, //true
`jquery('.class')`, //true
`jquery('div')`, //true
].forEach(str => console.log(pattern.test(str)));
答案 0 :(得分:5)
您可以使用反向引用捕获组中的第一个引号或双引号,并在末尾要求相同的组(相同的引号或双引号):
const re = /^(?:\$|Jquery)\((['"])[\.#]?[a-zA-Z][a-zA-Z0-9!]*\1\)$/gi;
console.log(re.test(`$("#id")`))
console.log(re.test(`$('#id")`))
console.log(re.test(`$("#id')`))
console.log(re.test(`$('#id')`))
还有一些其他问题需要解决:
/^\$|Jquery...
意味着以$
开头的 any 字符串将满足正则表达式。而是将它放在一个组中。
单引号'
不需要转义-最好删除反斜杠。
而不是
[\.|#]?
如果您想可能匹配.
或#
(而不是管道),请改用[\.#]?