Javascript - 返回方括号中的字符串

80
我需要返回字符串中方括号内的文本。我有下面这个正则表达式,但它也会返回方括号本身:
var matched = mystring.match("\\[.*]");

一个字符串中只会包含一组方括号,例如:

Some text with [some important info]

我希望matched包含“一些重要信息”,而不是目前得到的“[一些重要信息]”。

6个回答

149

使用分组。我已添加?使匹配变为“非贪婪”的,因为这可能是您想要的。

var matches = mystring.match(/\[(.*?)\]/);

if (matches) {
    var submatch = matches[1];
}

谢谢,这个东西对我有用,可以找到方括号中的数字。如何将另一个数字代替该数字放置在方括号之间?提前致谢。 - Bhavin Thummar

21

由于JavaScript不支持捕获,所以你必须绕过它。考虑采用相反的方法来解决问题。而不是捕获括号内的内容,移除括号外的内容。由于只会有一组括号,所以这应该可以正常工作。我通常使用这种技术来去除前导和尾随空格。

mystring.replace( /(^.*\[|\].*$)/g, '' );

如果在它后面有一个新行,它会在末尾添加 )。 - Varun Sharma

14

为了匹配两个相邻的方括号之间的任何文本,您可以使用以下模式:

\[([^\][]*)]
(?<=\[)[^\][]*(?=])

请看正则表达式演示#1正则表达式演示#2。需要注意的是,带有lookaround的第二个正则表达式仅在符合ECMAScript 2018标准的JavaScript环境中受支持。如果需要支持旧环境,请使用带有捕获组的第一个正则表达式。
细节:
- `(?<=\[)` - 正向后行断言,匹配紧接着`[`字符之前的位置(也就是说,当前位置左边必须紧跟着一个`[`字符) - `[^\][]*` - 匹配零个或多个(`*`)非`[`和`]`字符(请注意,与`([^\][]*)`版本相同的模式被捕获到ID为1的捕获组中) - `(?=])` - 正向先行断言,匹配紧接着`]`字符之后的位置(也就是说,当前位置右边必须紧跟着一个`]`字符)。
现在,在代码中,您可以使用以下内容:

const text = "[Some text] ][with[ [some important info]";
console.log( text.match(/(?<=\[)[^\][]*(?=])/g) );
console.log( Array.from(text.matchAll(/\[([^\][]*)]/g), x => x[1]) );
// Both return ["Some text", "some important info"]

这里是使用RegExp#exec在循环中提取捕获子字符串的传统方法:

var text = "[Some text] ][with[ [some important info]";
var regex = /\[([^\][]*)]/g;
var results=[], m;
while ( m = regex.exec(text) ) {
  results.push(m[1]);
}
console.log( results );


5
只需使用replacemap即可。
"blabla (some info) blabla".match(/\((.*?)\)/g).map(b=>b.replace(/\(|(.*?)\)/g,"$1"))

5

你试过捕获括号吗:

("\\[(.*)]");

这应该将括号内的模式作为捕获匹配返回到返回的数组中。

2
你无法这样做。JavaScript不支持反向预查。
你需要使用捕获组或者去掉括号。
顺便说一下,你可能不想在正则表达式中使用贪婪的.*。试试这个:
"\\[.*?]"

更好的方式是这样的:
"\\[[^\\]]*]"

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