我经常想要用正则表达式解析一个字符串,并找到所有匹配 plus 所有不匹配的字符串,并且所有匹配的字符串按原始顺序散布,例如。
var parsed = regexParse(/{([^}]+)}/g, 'Hello {name}, you are {age} years old');
因此parsed
将包含:
0 : "Hello "
1 : match containing {name}, name
2 : ", you are "
3 : match containing {age}, age
4 : " years old"
JavaScript(或一些广泛使用的库)中是否有类似于此regexParse
函数的内容?我写了我自己的版本,但似乎很明显,我怀疑必须已经有一种“标准”的方式:
var regexParse = function(rx, str) {
var nextPlain = 0, result = [], match;
rx.lastIndex = 0;
for (;;) {
match = rx.exec(str);
if (!match) {
result.push(str.substr(nextPlain));
break;
}
result.push(str.substr(nextPlain, match.index - nextPlain));
nextPlain = rx.lastIndex;
result.push(match);
}
return result;
};
更新
关于Dennis的回答,起初我以为它无法提供帮助,因为返回数组中的所有值都是字符串。如何判断哪些项目是不匹配的文本以及哪些项目来自匹配?
但是一些实验(无论如何使用IE9和Chrome)表明,当split
以这种方式使用时,它总是交替使用各个部分,因此第一个是纯文本,第二个是匹配,第三个是纯文本,依此类推。它遵循这个规则,即使有两个匹配没有不匹配的文本散布 - 在这种情况下它输出一个空字符串。
即使在微不足道的情况下:
'{x}'.split(/{([^}]+)}/g)
输出严格:
["", "x", ""]
所以如果你知道如何(以及这个假设是否成立)你可以告诉哪个是哪个!
我想使用ES5 array methods map
,forEach
和filter
。因此,使用我原来的regexParse
,可以使用typeof i == 'string
来检测哪些项目是不匹配的文字。
对于split
,它必须从返回数组中的位置确定,但这没关系,因为ES5数组方法传递第二个参数,索引,所以我们只需要找出它是否奇怪(匹配)或甚至(不匹配的文本)。例如,如果我们有:
var ar = '{greeting} {name}, you are {age} years old'.split(/{([^}]+)}/g);
现在ar
包含:
["", "greeting", " ", "name", ", you are ", "age", " years old"]
由此我们可以得到匹配:
ar.filter(function(s, i) { return i % 2 != 0; });
>>> ["greeting", "name", "age"]
或者只是纯文本,也删除空字符串:
ar.filter(function(s, i) { return (i % 2 == 0) && s; });
>>> [" ", ", you are ", " years old"]
答案 0 :(得分:6)
我认为你正在寻找具有捕获括号的split()
:
var myString = "Hello 1 word. Sentence number 2.";
var splits = myString.split(/(\d)/); // Hello ,1, word. Sentence number ,2, .