regex 输出js正则表达式组匹配

4dbbbstv  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(159)

我有一个这样的字符串:

hello [world (this is a string) with parenthesis](i'm in brackets too)

使用正则表达式,我试图得到任何包含在方括号[...]内的匹配,也得到任何包含在圆括号(...)内的匹配,我的一些字符串只包含(...),一些只包含[...],其他的则包含两者的混合,嵌套和分离,如上面的例子所示。
所以,我想达到的输出:

1. [world (this is a string) with parenthesis]
2. (this is a string)
3. (i'm in brackets too)

我假设1。将是匹配组1,2&3将是匹配组2?
我目前使用的代码和正则表达式是:

var str = "hello[world(this is a string) with parenthesis](i'm in brackets too)";
var re = /\[(.*?)\]|\((.*?)\)/g; // try and get all [] and ()

var match = re.exec(str.toString());

if (match) {
  // how do I output what are in square brackets
  // and what are in round brackets?
  // is it console.log(match[1]) for example ?? 
}

我在用|操作符,我认为这可能会影响结果。它是否在匹配时立即停止,并且不捕获任何类型括号中的其他字符串?
我遇到的主要问题是试图访问匹配的组-我以为它们会在match[0]和match[1]中,因为我期望2个组,但当我console.log它们时,我得到了相同的结果。

jhkqcmku

jhkqcmku1#

看起来你的问题是由你期望的匹配重叠的事实引起的(一个可能是另一个的一部分)。因此,你只需要将你的表达式 Package 成一个未锚定的正向前看:

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

下面是一个regex demo(我用更有效的否定字符类替换了懒惰的点匹配)。
JS演示:

var re = /(?=\[([^\]]*)\]|\(([^)]*)\))/g; 
var str = 'hello [world (this is a string) with parenthesis](i\'m in brackets too) ';
var res = [];
 
while ((m = re.exec(str)) !== null) {
    if (m.index === re.lastIndex) {   // These lines are required as
        re.lastIndex++;               // the regex matches an empty string
    }
    if (m[1]) {                      // The capture groups
       res.push(m[1]);               // hold the text we need
    } else {
      res.push(m[2]);
    }
}
document.body.innerHTML = "<pre>" + JSON.stringify(res, 0, 4) + "</pre>";

相关问题