gpt4 book ai didi

javascript - 从 JavaScript 正则表达式中获取一组匹配项和纯字符串

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:54:01 25 4
gpt4 key购买 nike

我经常想用正则表达式解析一个字符串,然后找到所有匹配加上所有不匹配的字符串,并且所有字符串都以它们的原始顺序散布,例如

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 mapforEachfilter。因此,对于我的原始 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, .

关于javascript - 从 JavaScript 正则表达式中获取一组匹配项和纯字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6384294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com