【问题标题】:All characters in a string must match regex字符串中的所有字符必须匹配正则表达式
【发布时间】:2022-01-12 14:02:46
【问题描述】:

很抱歉,如果以前出现过这种情况,但我在 google 上找不到任何能满足我需求的东西。

我有一个可以写表达式的字段:x>1、x>2||x<1(x>1) && (x<2) 等。 我想要的是一个检查表达式的正则表达式,因此它只能包含某些有效字符来防御代码注入。 a.1 不应该匹配。

到目前为止,我正在使用这个:

expression.match('[xX<>=|0-9&().]')

但这也会返回包含任何这些字符的任何内容。我想要的是一个只有在所有字符都匹配正则表达式中的任何一个时才返回的表达式。

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    在你的字符类和锚之后你需要* 或+ 量词:

    /^[xX<>=|0-9&()\s.]*$/.test(expression)
     ^                 ^^
    

    现在,它将匹配

    • ^ - 字符串开头
    • [xX&lt;&gt;=|0-9&amp;\s().]* - 零个或多个(如果您使用+,则为一个或多个)在 char 类中定义的字符
    • $ - 字符串结束。

    简短演示:

    console.log(/^[xX<>=|0-9&\s().]*$/.test("a.1"));
    console.log(/^[xX<>=|0-9&\s().]*$/.test("(x>1) && (x<2)"));

    注意,我也添加了\s 来匹配空格。

    【讨论】:

    • 由于(x&gt;1) &amp;&amp; (x&lt;2)包含空格,我也建议将\s添加到模式中。
    • 我试过 new RegExp('/^[xX&lt;&gt;=|0-9&amp;().]*$/').test(expression) where expression = x&gt;1 它给了我错误
    • 当然它会给你错误,因为你的x&gt;1在开头之前不包含/,在字符串结尾之后不包含/。不要使用 RegExp 构造函数,使用 regex 文字:/^[xX&lt;&gt;=|0-9&amp;\s().]*$/.test("x&gt;1")
    • 哦,所以如果你不使用 RegExp 构造函数,你必须在开头和结尾添加 / 来告诉编译器它是一个正则表达式?为什么要使用它而不是构造函数?
    • 花了我半个工作日才找到这个帖子并解决了我的问题。希望我能给这个答案两个赞成票。
    猜你喜欢
    • 2022-01-15
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2020-05-28
    • 1970-01-01
    相关资源
    最近更新 更多