为什么这个字符串没有通过测试功能?

时间:2015-06-18 20:44:13

标签: javascript regex

这就是我的所作所为:

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,但事实并非如此。我想知道,我做错了什么?

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:5)

因为你没有逃避使()成为捕获组的 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/* Base <= node <= node <= node * | ^ * | ptr to last node | * ------------------------- */ class Node { private: Node* prev; public: explicit Node(Node* parent) : prev(parent) { Node* foo_ptr = this; while (foo_ptr->prev != 0) { foo_ptr = foo_ptr->prev; } // foo_ptr points to Base, how can I now change Base::last? } }; class Base : public Node { private: Node* last; public: Base() : Node(0), last(this) {} }; 。此外,这段时间也需要进行转义,因此它与任何角色都不匹配。

&#13;
&#13;
Base::last
&#13;
&#13;
&#13;