【问题标题】:Why does global modifier not work properly?为什么全局修饰符不能正常工作?
【发布时间】:2013-11-05 01:39:56
【问题描述】:

为什么“g”修饰符在这种情况下不起作用?我认为用逗号分隔变量并添加“g”是将匹配设置为全局匹配的可接受方式?

str = "cabeca";
testcases = [];
x = 0;
for (i = 0; i < str.length; i++) {
testcases = str[i];
    x = i + 1;
    while (x < str.length) {
            testcases += "" + str[x];
            if (str.match((testcases),"g").length >= 2) {
            console.log(testcases);
            }
        x++;
    }
}

当前演示(仍然无法运行)http://jsfiddle.net/zackarylundquist/NPzfH/

【问题讨论】:

  • varvarvarvarvarvar
  • 请注意,分配testcases = [] 是没有意义的,因为您在使用testcases 之前先执行testcases = str[i]。您不能在 ECMAScript 中“键入”变量。

标签: javascript loops while-loop global modifier


【解决方案1】:

您需要定义一个实际的RegExp 对象。

new RegExp(testcases, 'g');

但是请注意,如果您的字符串包含需要以正则表达式模式转义的字符,则可能会导致意外结果。

例如

var s = 'test.',
    rx = new RegExp(s);

rx.test('test1'); //true, because . matches almost anything

因此,您必须在输入字符串中对其进行转义。

rx = new RegExp(s.replace(/\./, '\\.'));

rx.test('test1'); //false
rx.test('test.'); //true

【讨论】:

  • 是的,但要注意原始字符串是否包含元字符。
  • @Pointy 我添加了一些精度。
  • 添加上面的代码会返回 {} 的结果,而不是它应该匹配的字母。 jsfiddle:jsfiddle.net/zackarylundquist/NPzfH
【解决方案2】:

match() 方法只需要一个参数 - 一个正则表达式对象。要像您尝试使用 RegExp 构造函数一样从字符串构造正则表达式:

testcases = new RegExp(str[i],'g');

那么你可以这样做:

if (str.match(testcases).length >= 2) {
    console.log(testcases);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 2019-01-04
    • 2020-09-03
    • 2016-10-10
    • 2016-10-24
    • 2017-02-27
    • 2017-07-08
    相关资源
    最近更新 更多