我正在使用在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
我做错了什么?!
答案 0 :(得分:1)
看起来你正在寻找匹配而不是分割字符串
使用str.match(patt)
相反,您的答案是将字符串拆分两次,因为正则表达式在两个位置匹配。用正则表达式分割一个字符串给出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)