JavaScript正则表达式计算错误

时间:2015-09-14 12:17:51

标签: javascript regex

我正在使用在Chrome浏览器上执行的本地JavaScript。 我真的不明白为什么这会提供错误的结果:

脚本:

var str = "hello 1 test test hello 2";
var patt = /(hello \S+)/g;
var res = str.split(patt);
//var res = str.search(patt);
if(res!=null) {
    for(var i=0;i<res.length;i++) console.log(i+res[i]);
}

输出:

0
1hello 1
2 test test 
3hello 2
4

预期结果:

0hello 1
1hello 2

我做错了什么?!

4 个答案:

答案 0 :(得分:1)

看起来你正在寻找匹配而不是分割字符串

使用str.match(patt)

str.match

相反,您的答案是将字符串拆分两次,因为正则表达式在两个位置匹配。用正则表达式分割一个字符串给出3个部分。比赛前,比赛和比赛结束后。

你的字符串匹配了两次。这意味着这个过程发生了两次,产生了5个部分,显示的结果(两个部分是空的)。

答案 1 :(得分:0)

匹配方法

使用match,它更简单,只需使用/hello\s+\S+/g

var str = "hello 1 test test hello 2";
var patt = /hello\s+\S+/g;
var res = str.match(patt);
if(res!=null) {
    for(var i=0;i<res.length;i++)
        console.log(i+res[i]);
      }

请注意,在这种情况下您不需要任何捕获组,因为您没有使用捕获的文本,您需要整个匹配的文本。此外,\s+将匹配hello和一系列非空白字符之间的任何空格。

拆分方法

您需要匹配hello \S+之后的其余字符串,并在输出之前删除空白条目:

var str = "hello 1 test test hello 2";
var patt = /(hello \S+).*?(?=$|hello \S)/g;
var res = str.split(patt);
//var res = str.search(patt);
if(res!=null) {
   res = res.filter(Boolean);
    for(var i=0;i<res.length;i++)
      if (res[i]) {
        console.log(i+res[i]);
      }
}

结果:

0hello 1
js:21 1hello 2

正则表达式 - (hello \S+).*?(?=$|hello \S) - 匹配并捕获hello +一系列非空白符号,然后是任何字符,但换行符直到字符串末尾或下一个hello +非空白字符。

我使用res.filter(Boolean);删除了结果数组中的空元素(在使用正则表达式进行拆分时几乎总是存在)。

答案 2 :(得分:0)

您使用了split,然后在/(hello \S+)/g的每次匹配之前和之后都有一个包含所有值的数组。

您想使用match

"hello 1 test test hello 2".match(/(hello \S+)/g);
// ["hello 1", "hello 2"]

答案 3 :(得分:0)

split ...拆分字符串。

正如x,y,z分割/(,)/会给你["x", ",", "y", ",", "z"]一样,你会得到这里看到的结果。

你想要做的是迭代匹配:

str.match(/(hello \S+)/g)