JavaScript,正则表达式解析花括号内的字符串内容。

21

我对正则表达式很陌生。 我试图解析字符串中花括号内的所有内容。 我参考了这篇帖子,并按照其中一条回答的建议进行操作,但结果出乎意料。

以下是我的操作步骤:

var abc = "test/abcd{string1}test{string2}test" //any string
var regex = /{(.+?)}/
regex.exec(abc) // i got ["{string1}", "string1"]
             //where i am expecting ["string1", "string2"]

我觉得我漏掉了什么,我做错了什么吗?

更新

我使用/g进行全局搜索就可以了。

var regex = /{(.*?)}/g
abc.match(regex) //gives ["{string1}", "{string2}"]

如何在不使用括号的情况下获取字符串?

6个回答

32
"test/abcd{string1}test{string2}test".match(/[^{}]+(?=\})/g)

生成

["string1", "string2"]
它假设每个}之前都有相应的{,并且{...}部分不会嵌套。它也不会捕获空的{}部分的内容。

4
这很好。但是你不需要转义闭合括号。/[^{}]+(?=})/g - Kash
如何使用方括号 [ ] 实现相同的功能? - AuthorProxy
@AuthorProxy,要在字符集中包含 [],请对它们进行转义。[\[\]] 是一个只包含方括号的字符集。 - Mike Samuel
@MikeSamuel 这不起作用,请在任何在线正则表达式检查器中核实。 - AuthorProxy
@AuthorProxy 我知道了。在JS中,/[\[\]]+/.exec('a[[]]b')[0] === '[[]]'是正确的。 - Mike Samuel

3
var abc = "test/abcd{string1}test{string2}test" //any string
var regex = /{(.+?)}/g
var matches;

while(matches = regex.exec(abc))
    console.log(matches);

2

试试这个:

var abc = "test/abcd{string1}test{string2}test" //any string
var regex = /{(.+?)}/g //g flag so the regex is global
abc.match(regex) //find every match

一个很好的关于JavaScript中正则表达式的阅读材料在这里,一个不错的测试地方在这里。祝你好运!

我认为在这里 g 不会有任何影响。它没有获取第二个匹配项(string2),因为它只调用了一次 exec。 - Kash
@Kash 你说得对,但我调用了match函数,如果没有加g参数,它会返回["{string1}", "string1"] - nicosantangelo

1

这个结果:

["{string1}", "string1"]

这里展示的是第一次匹配,整个正则表达式匹配了"{string1}",而第一个捕获括号匹配了"string1"

如果你想获取所有匹配并查看每个匹配的所有捕获括号,你可以使用"g"标志并循环调用exec()多次,像这样:

var abc = "test/abcd{string1}test{string2}test"; //any string
var regex = /{(.+?)}/g;
var match, results = [];
while (match = regex.exec(abc)) {
    results.push(match[1]);   // save first captured parens sub-match into results array
}

// results == ["string1", "string2"]

你可以在这里看到它的工作效果:http://jsfiddle.net/jfriend00/sapfm/


在条件语句中进行赋值... 不是我的菜。 - jbabey
这是一种高效的循环方式,对于这种特定目的而言也相当常见。通常情况下我也会避免使用它,除非在这种情况下。如果你愿意,可以多写几行代码来完成同样的事情而不需要使用它。 - jfriend00
谢谢您的解释,我一直在想为什么同样的字符串出现了两次。谢谢! - MengQi Han

1

尝试使用该代码处理文件

const fs = require('fs');

fs.readFile('logs.txt', function(err, data) {
if(err) throw err;
const paragraph = "'" + data + "'";
const regex = /\d+\<;>\S+\<;>(\d+)\<;/g;
const found = paragraph.match(regex);

console.log(found);
})

1

没有问题。但是你需要查看捕获组(数组中的第二个元素)以获取所需内容(可以忽略第一个)。要获取所有出现次数,仅运行一次exec是不够的,你需要使用match循环遍历结果。

编辑:别管那个了,据我所知,你无法使用match访问捕获组。一个更简单的解决方案是使用正向先行断言,就像Mike Samuel suggested建议的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接