使用正则表达式验证jquery选择器语法

时间:2018-07-05 05:16:22

标签: javascript regex

我正在尝试在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)));

1 个答案:

答案 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 字符串将满足正则表达式。而是将它放在一个组中。

单引号'不需要转义-最好删除反斜杠。

而不是

[\.|#]?

如果您想可能匹配.#(而不是管道),请改用[\.#]?