RegEx使用RegExp.exec从字符串中提取所有匹配项


175

我正在尝试解析以下类型的字符串:

[key:"val" key2:"val2"]

里面有任意键:“ val”对。我想获取键名和值。对于那些好奇的人,我想解析任务战士的数据库格式。

这是我的测试字符串:

[description:"aoeu" uuid:"123sth"]

这是要强调的是,除了空格之外,任何其他内容都可以位于键或值中,冒号周围没有空格,并且值始终用双引号引起来。

在节点中,这是我的输出:

[deuteronomy][gatlin][~]$ node
> var re = /^\[(?:(.+?):"(.+?)"\s*)+\]$/g
> re.exec('[description:"aoeu" uuid:"123sth"]');
[ '[description:"aoeu" uuid:"123sth"]',
  'uuid',
  '123sth',
  index: 0,
  input: '[description:"aoeu" uuid:"123sth"]' ]

而且description:"aoeu"也符合这种模式。我如何找回所有比赛?


可能是我的regex错误和/或我只是在JavaScript中错误地使用了regex工具。这似乎可行:> var s =“十五是15,八是8”;> var re = / \ d + / g; > var m = s.match(re); m = ['15','8']
gatlin 2011年

6
Javascript现在具有.match()函数:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 像这样使用:"some string".match(/regex/g)
Stefnotch

Answers:


237

继续re.exec(s)循环调用以获取所有匹配项:

var re = /\s*([^[:]+):\"([^"]+)"/g;
var s = '[description:"aoeu" uuid:"123sth"]';
var m;

do {
    m = re.exec(s);
    if (m) {
        console.log(m[1], m[2]);
    }
} while (m);

与此JSFiddle一起尝试:https ://jsfiddle.net/7yS2V/


8
为什么不while代替do … while呢?
Gumbo

15
使用while循环会使初始化m有点尴尬。您要么必须编写while(m = re.exec(s))(这是一种反模式的IMO),要么必须编写m = re.exec(s); while (m) { ... m = re.exec(s); }。我更喜欢这种do ... if ... while成语,但其他技术也可以使用。
grasssea 2011年

14
用铬做这导致我的标签崩溃。
EdgeCaseBerg 2014年

47
@EdgeCaseBerg您需要g设置标志,否则内部指针不会向前移动。文件
蒂姆(Tim)

12
另一点是,如果正则表达式可以匹配空字符串,则将是一个无限循环
FabioCosta
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.