【问题标题】:Why does not this string pass test function?为什么这个字符串没有通过测试功能?
【发布时间】:2015-06-18 20:44:12
【问题描述】:

这就是我的工作:

var input_string = "(1) (1) test.txt";
var reg = new RegExp('^\\(\\d+\\)\\s+' + input_string,'i');
var tested_string = "(1) (1) (1) test.txt";
alert(reg.test(tested_string)); // returns false

我希望它返回 true,但事实并非如此。我想知道,我做错了什么?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    您必须转义所有括号,而您不是。将\\ 添加到输入字符串上的( 将使其工作:

    var input_string = "\\(1\\) \\(1\\) test.txt"; // fixed
    var reg = new RegExp('^\\(\\d+\\)\\s+' + input_string,'i');
    var tested_string = "(1) (1) (1) test.txt";
    alert(reg.test(tested_string)); // returns true now
    

    会起作用的。

    如果您需要在正则表达式中使用任意字符串您需要转义它们。我建议您在将其添加到RegExp 对象之前使用如下函数:

    function escapeRegExp(stringToGoIntoTheRegex) {
        return stringToGoIntoTheRegex.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
    }
    

    你的情况可能是这样的:

    var input_string = "(1) (1) test.txt";
    var reg = new RegExp('^\\(\\d+\\)\\s+' + escapeRegExp(input_string),'i'); // using it here
    var tested_string = "(1) (1) (1) test.txt";
    alert(reg.test(tested_string)); // returns true as expected
    

    demo fiddle

    【讨论】:

    • 谢谢!你的回答是第一位的,我会接受它,只要 stackoverflow 允许我这样做 -)
    • Np。确保检查escapeRegExp() 函数。它可能会在未来证明自己有用!
    • 根本不需要转义/。如果通过 RegExp 构造函数构造,它在正则表达式中没有特殊含义。
    • @nhahtdh 在互联网上有几个该功能的实现,一些包括/,一些没有。我同意逃避它似乎是不必要的,但有些do report 在不逃避时会遇到问题。所以,是的,我想根据具体情况,我们可以将其设为“可选”。
    • @acdcjunior 请注意,答案的作者不会在评论后更新帖子,如果您阅读他的博客,他会写一些关于 ES6 正则表达式的东西。
    【解决方案2】:

    因为您没有逃脱 () 这使它们捕获组。此外,句点也需要转义,因此它不是匹配任何字符。

        var input_string = "\\(1\\) \\(1\\) test\\.txt";
        var reg = new RegExp('^\\(\\d+\\)\\s+' + input_string,'i');
        var tested_string = "(1) (1) (1) test.txt";
        alert(reg.test(tested_string)); // returns false

    【讨论】:

    • 这非常有用。谢谢你,先生!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多