【问题标题】:Validate jquery selector syntax using regex使用正则表达式验证 jquery 选择器语法
【发布时间】:2018-07-05 05:16:21
【问题描述】:

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

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    您可以捕获组中的第一个引号或双引号,并在末尾使用反向引用要求同一组(相同的引号或双引号):

    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 字符串将满足正则表达式。而是将其包含在一个组中。

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

    而不是

    [\.|#]?
    

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

    【讨论】:

    • 所以\1 可以与第一个捕获组匹配
    • wt ?: 会做吗?
    • 它使该组成为非捕获组 - 这样,第一个捕获的组是引号,稍后允许\1。 (可以很容易地使用标准的第一组,然后使用 \2 进行反向引用)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 2012-04-19
    相关资源
    最近更新 更多