【问题标题】:Matching capture group multiple times within parent match在父匹配中多次匹配捕获组
【发布时间】:2017-10-11 02:18:12
【问题描述】:

假设我有一个这样的字符串:

hello blah(1) ndnddnnn div1 - 这个 ;sdhfdkl;a div2 - 我应该

我正在尝试提取blah!blah 之间的特定信息。这是我想要的信息的一个例子:

  • 1
    • 1,这个
    • 2,应该
    • 3, 是
    • 4,捕获
  • 2
    • 35,也
    • 24,这些
    • 0,需要
    • 94,捕获

这是我正在尝试使用的正则表达式:

/blah\((\d)\)(([\s\S]*?div([\d]) - (\w+) )+)[\s\S]*?(?!\!blah)/g

这是我对我定义的正则表达式字符串的理解:

  • blah\((\d)\):捕获括号内的数字
  • ([\s\S]*?div([\d]) - (\w+) ):在“div”之前的一些随机文本,然后捕获 div 之后的数字和- 之后的单词。此语句包含在我想要匹配一次或多次的捕获组中。 regex101 告诉我,我需要将其包装在另一个捕获组中以获取所有实例。我在 blah!blah 中的文本本质上是 divX - YYYYY 格式,前面是一些随机文本。
  • [\s\S]*?(?!\!blah):以一些随机文本结尾,后面的内容与 !blah 匹配。

Here is it in action

由于某种原因,我没有得到我想要的匹配项,如您在上面的链接中所见。我究竟做错了什么?我上面所做的一些假设是不正确的吗?感谢您的帮助

【问题讨论】:

    标签: javascript regex regex-group


    【解决方案1】:

    这个样本怎么样?我在这种情况下使用了regexObj.exec(str)

    示例脚本:

    var str = "hello blah(1) ndnddnnn div1 - this ;sdhfdkl;a div2 - should i<;oisdjn div3 - be div4 - captured ois;s;urbb !blah aksdhflakjsfadlfjkbafa;km blah(2) ndnddnnn div35 - also ;sdhfdkl;a div24 - these i<;oisdjn div0 - need div94 - capture ois;s;urbb !blah world";
    var re  = /\((\d)\)|div(\d.?)\s-\s(\w.*?)\s/g;
    var ar = [];
    while ((res=re.exec(str)) !== null) {
      if (res[1]) {
        var temp = res[1];
      } else {
        ar.push([temp, res[2], res[3]]);
      }
    };
    console.log(ar);

    结果:

    [
        ["1", "1", "this"],
        ["1", "2", "should"],
        ["1", "3", "be"],
        ["1", "4", "captured"],
        ["2", "35", "also"],
        ["2", "24", "these"],
        ["2", "0", "need"],
        ["2", "94", "capture"]
    ]
    
    • \((\d)\) 用于检索() 包围的数字。
    • div(\d.?)\s-\s(\w.*?)\s 用于从div#1 - this 中检索“1”和“this”。

    jsfiddle.net

    regex101.com

    如果我误解了你的问题,我很抱歉。

    【讨论】:

    • 感谢您的回答。这基本上可以满足我的要求,但我想知道是否有任何方法可以将 blah(#) 与其包含的 div 相关联。例如,如果 # 是一个类别编号,有没有办法将前 4 个 div 与那个 # 相关联?还是我应该正则表达式较大的 blah -> !blah 文本,然后用循环正则表达式中的每个“块”?
    • @mithunm93 感谢您的回复。我更新了我的答案。请证实。检索到的数据被导入到数组中。 #blah(#) 用于数组的第一个索引。您可以使用数组中的数据。我对您的评论的理解正确吗?
    • 这正是我需要的,谢谢!我试图弄清楚是否有任何方法可以在不使用循环的情况下做到这一点,但这实际上非常干净。谢谢!
    • @mithunm93 欢迎您。也谢谢你。
    猜你喜欢
    • 2020-02-01
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多