我试图使用正则表达式来匹配两个字符之间的内部文本,但是我得到了错误的文本
我尝试用[A-z] *代替。*来仅匹配内部文本,并且可以正常工作。但是我也需要匹配非字母字符。
/\[?(,? ?\[(\[(.+)-(.+)\])\])\]?/g
这是我的正则表达式,我想匹配方括号之间的字符:
[[[[ hello-hello]],[[hi -hi]]]
粗体字符是匹配的一个。
我希望在比赛1中匹配[[[ hello-hello ]],[[hi-hi]]], 在第二场比赛中[[[hello-hello]],[[ hi-hi ]]]。
答案 0 :(得分:2)
答案 1 :(得分:2)
我会用这样的东西:
\[(?!\[)([^\]]*)\]
这将匹配一个[
字符,如果没有后跟一个[
字符。然后,它将匹配在第1组中捕获它们的任意数量的非]
字符。然后匹配一个]
字符。
const text = "[[[hello-hello]],[[hi-hi]]]";
const regex = /\[(?!\[)([^\]]*)\]/g;
var match;
while (match = regex.exec(text)) {
console.log(match);
}
或者,您可以省略捕获组并删除每个匹配项的第一个和最后一个字符。
const text = "[[[hello-hello]],[[hi-hi]]]";
const regex = /\[(?!\[)[^\]]*\]/g;
console.log(
text.match(regex)
.map(match => match.slice(1, -1))
);
答案 2 :(得分:2)
如果需要[]
之间的所有内容,那么我们可以将表达式简化为:
(?:\[+)(.+?)(?:\]+)
在这里,我们在此捕获组中捕获了我们可能想要的子字符串:
(.+?)
然后,我们使用两个非捕获组在其左侧和右侧添加两个边界:
(?:\[+)
(?:\]+)
const regex = /(?:\[+)(.+?)(?:\]+)/g;
const str = `[[[hello-hello]]
[[hi-hi]]]
[[hi hi]]]`;
const subst = `$1`;
// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);
console.log('Substitution result: ', result);
如果不需要此表达式,可以在regex101.com中对其进行修改/更改。
jex.im可视化正则表达式:
答案 3 :(得分:2)
您可以使用1个捕获组来捕获您的值。
可以使用negated character class \[([^][\n-]+
匹配连字符前后的值,而不匹配左括号或右括号,连字符或换行符。
在模式中,您使用的点将匹配除换行符以外的任何字符,因此,否定的字符类包含换行符以防止交叉线。
\[([^\][\n-]+-[^\][\n-]+)]
说明
\[
匹配[
(
开始捕获组
[^\][\n-]+
否定的字符类,匹配1次以上而不是]
,[
,-
或换行符-
匹配-
[^\][\n-]+
匹配1次以上,而不是]
,[
,-
或换行符)
关闭捕获组]
匹配]
字符
const regex = /\[([^\][\n-]+-[^\][\n-]+)]/g;
const str = `[[[hello-hello]],[[hi-hi]]]`;
let m;
while ((m = regex.exec(str)) !== null) {
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
console.log(m[1]);
}
答案 4 :(得分:1)