gpt4 book ai didi

JavaScript 正则表达式重复(子)组

转载 作者:行者123 更新时间:2023-11-29 15:39:14 25 4
gpt4 key购买 nike

是否可以使用正则表达式从一次调用中返回所有重复和匹配的子组?

例如,我有一个像这样的字符串:

{{token id=foo1 class=foo2 attr1=foo3}}

其中属性的数量(即 idclassattr1)未定义,可以是任何 key=value 对。

例如,目前我有以下 regexp and output

var pattern = /\{{([\w\.]+)(?:\s+(\w+)=(?:("(?:[^"]*)")|([\w\.]+)))*\}\}/;
var str = '{{token arg=1 id=2 class=3}}';

var matches = str.match(pattern);
// -> ["{{token arg=1 id=2 class=3}}", "token", "class", undefined, "3"]

好像只匹配最后一组;有没有办法获得所有其他“属性”(argid)?

注意:该示例说明了对单个字符串的匹配,但搜索到的模式位于更大的字符串中,可能包含许多匹配项。所以,^$ 不能使用。

最佳答案

这在一个正则表达式中是不可能做到的。 JavaScript Regex 只会返回给你最后匹配的组,这正是你的问题。不久前我遇到了这个问题:Regex only capturing last instance of capture group in match .您可以在 .Net 中使用它,但这可能不是您所需要的。

我相信您可以弄清楚如何在正则表达式中执行此操作,然后吐出第二组的参数。

\{\{(\w+)\s+(.*?)\}\}

这里有一些 javaScript 代码向您展示了它是如何完成的:

var input = $('#input').text();
var regex = /\{\{(\w+)\s*(.*?)\}\}/g;
var match;
var attribs;
var kvp;
var output = '';

while ((match = regex.exec(input)) != null) {
output += match[1] += ': <br/>';

if (match.length > 2) {
attribs = match[2].split(/\s+/g);
for (var i = 0; i < attribs.length; i++) {
kvp = attribs[i].split(/\s*=\s*/);
output += ' - ' + kvp[0] + ' = ' + kvp[1] + '<br/>';
}
}
}
$('#output').html(output);

jsFiddle

一个疯狂的想法是使用正则表达式和替换将代码转换为 json,然后使用 JSON.parse 解码。我知道以下是这个想法的开始。

/[\s\S]*?(?:\{\{(\w+)\s+(.*?)\}\}|$)/g.replace(input, doReplace);

function doReplace ($1, $2, $3) {
if ($2) {
return "'" + $2 + "': {" +
$3.replace(/\s+/g, ',')
.replace(/=/g, ':')
.replace(/(\w+)(?=:)/g, "'$1'") + '};\n';
}
return '';
}

REY

关于JavaScript 正则表达式重复(子)组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22511031/

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