Javascript 检测大括号(不包括字符串)之间的文本。部分代码完成

Javascript 检测大括号(不包括字符串)之间的文本。部分代码完成,javascript,regex,Javascript,Regex,我几乎没有使用正则表达式的经验。我要做的是匹配大括号之间的文本,如下所示: {([^}]*)} (["'])(?:(?!\1)[^\\]|\\.)*\1? 演示: 但当它们位于引号(单引号和双引号)之间且带有转义字符时,请不要匹配它们,如下所示: {([^}]*)} (["'])(?:(?!\1)[^\\]|\\.)*\1? 演示: 我设法创建了这两个正则表达式,但我不确定它们是否好。问题是我让他们分开工作。现在我想统一他们,但我不知道。如何实现这一点?使用以下正则表达式模式: \{([

我几乎没有使用正则表达式的经验。我要做的是匹配大括号之间的文本,如下所示:

{([^}]*)}
(["'])(?:(?!\1)[^\\]|\\.)*\1?
演示:

但当它们位于引号(单引号和双引号)之间且带有转义字符时,请不要匹配它们,如下所示:

{([^}]*)}
(["'])(?:(?!\1)[^\\]|\\.)*\1?
演示:


我设法创建了这两个正则表达式,但我不确定它们是否好。问题是我让他们分开工作。现在我想统一他们,但我不知道。如何实现这一点?

使用以下正则表达式模式:

\{([^}\"']+)\}(?!['"])


(?!['”])
-先行否定断言,匹配用大括号括起来的单词(如果它们不在引号之间)

使用以下正则表达式模式:

\{([^}\"']+)\}(?!['"])


(?!['“])
-先行否定断言,匹配用大括号括起来的单词(如果它们不在引号之间)

在Javascript中,仅使用模式无法实现这一点

一个简单的解决方法是交替连接两个模式,并测试捕获组:

var re = /(["'])(?:(?!\1)[^\\]|\\[\s\S])*\1?|{([^}]*)}/g;
var str = 'asd + {ASD} + {A-._&SD} + "asd\\"{A-.\'_&SD}" + \'a\\\'s\\\\d\' + "" + \'\'';
var m;
while ((m = re.exec(str)) !== null) {
  if (!m[1])
      console.log(m[2]);
}
在替换上下文中,使用函数作为替换参数执行相同的测试:

var result = str.replace(re, function (m, g1, g2) {
    if (g1) return m;
    // do what you want with g2
    return '#' + g2 + '#';
}); 

在Javascript中,只有模式没有真正的方法来实现这一点

一个简单的解决方法是交替连接两个模式,并测试捕获组:

var re = /(["'])(?:(?!\1)[^\\]|\\[\s\S])*\1?|{([^}]*)}/g;
var str = 'asd + {ASD} + {A-._&SD} + "asd\\"{A-.\'_&SD}" + \'a\\\'s\\\\d\' + "" + \'\'';
var m;
while ((m = re.exec(str)) !== null) {
  if (!m[1])
      console.log(m[2]);
}
在替换上下文中,使用函数作为替换参数执行相同的测试:

var result = str.replace(re, function (m, g1, g2) {
    if (g1) return m;
    // do what you want with g2
    return '#' + g2 + '#';
}); 

首先,为什么忍者会被否决?第二,@WiktorStribiżew,谢谢你的回复。让它工作起来。我们将了解这一点,并使其在JavaScript中工作。首先,为什么忍者否决?第二,@WiktorStribiżew,谢谢你的回复。让它工作起来。“我将学习这一点,并使其在JavaScript中工作。”CasimimiritHippolyte同意,并修正了这一点,这比我所尝试的要好。我从一件小事开始,以一个大怪物xD来分析它结束。你们俩都是好心人,能解释一下为什么我会落选吗?我知道这可能是一个新手问题,但我不是一个喜欢正则表达式的人,不能在这上面浪费更多的时间。是在这里问问题,还是在做一个编程解决方案而不是正则表达式。@JorgeFuentesGonzález,有很多仇恨者,他们喜欢这样downvoting@JorgeFuentesGonzález:如果我是你,我会在问题本身写下模式。@Casimimirithippolyte,我不能说我完全理解你的评论。我的正则表达式的哪个具体部分有问题?我正在努力使它尽可能好。您指的是第一个断言
(?![“'])
应该留心吗?@CasimimiritHippolyte同意,这比我尝试的要好。我从一件小事开始,以一个大怪物xD来分析它。你们两个都是好心人,你们能解释一下为什么我会被否决吗?我知道这可能是一个新手问题,但我不是一个雷格克斯人和c不要在这上面浪费太多时间。我们在这里问问题,或者做一个编程解决方案,而不是正则表达式。@JorgeFuentesGonzález,有很多仇恨者,他们喜欢这样downvoting@JorgeFuentesGonzález:如果我是你,我会在问题本身中写下模式。@Casimimirithippolyte,我不能说我完全理解了你的评论我的正则表达式的具体部分有问题吗?我正在尽可能地改进它。你的意思是第一个断言
(?![“'))
应该是一个lookback?仍然优于直接编程方法。仍然优于直接编程方法。