从JavaScript正则表达式中获取匹配项和纯字符串的数组
Getting an array of matches and plain strings from a JavaScript regular expression
我经常想用正则表达式解析一个字符串,并找到所有匹配的加上所有不匹配的字符串,所有字符串都按原始顺序穿插,例如
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数组方法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"]
我想您正在寻找带有捕获括号的split()
:
var myString = "Hello 1 word. Sentence number 2.";
var splits = myString.split(/('d)/); // Hello ,1, word. Sentence number ,2, .
相关文章:
- 将JSON转换为typescript中的字符串数组
- 在Javascript中将一个值和字符串数组转换为if语句
- 如何将正则表达式包含到字符串数组中
- JavaScript:将字符串数组转换为文本区域
- Knockout中的字符串数组
- 拆分字符串数组(JavaScript)后未定义
- 使用Javascript获取两个字符串之间的字符串数组
- 打印从Spring MVC Controller发送的字符串数组只显示“;toJSON”;在javascript中
- 将一个字符串数组解析为一个新的数组javascript
- AngularJS - 从字符串数组中连续更改文本
- 使用字符串数组中的字符填充 HTML 表
- 如何在 Javascript 中将字符串数组列表插入到表行中
- 创建二维字符串数组
- 如何从字符串数组中获取子字符串数组
- 如何将字符串数组转换为简单数组
- 按字母顺序、数字顺序和特殊字符对字符串数组进行排序
- 如何从字符串数组中获得8个随机唯一元素
- json_encode($myVar);正在给出地图,我想要一个字符串数组
- 函数,返回javascript中两个字符串数组的差值
- Javascript字符串数组转换为用逗号分隔的多个字符串