【问题标题】:Regex to match contents of a string preceded by particular string and ended with a particular string正则表达式匹配以特定字符串开头并以特定字符串结尾的字符串内容
【发布时间】:2026-01-05 16:20:03
【问题描述】:

如何制作一个正则表达式来提取以下 first 方括号的内容?

Block[first_name][value] 返回字符串first_name

Block[last_name][value] 返回字符串last_name

我的尝试:

这是我当前的正则表达式:http://regex101.com/r/jW0hY1/1

/(?:Block\[).*(?:\[value])/

首先我想我会为Block[ 进行非捕获匹配。然后我会捕获所有内容,直到][value] 开始。相反,这似乎返回了整个字符串。

【问题讨论】:

  • 请发布您的java代码
  • 它被标记为 javascript... 但请检查指向 regex101 的链接以查看测试
  • 出于某种原因,我将其读作 Java。我的坏
  • 我想你把非捕获组和lookahead/lookbehind(后者是not supported in JS)混为一谈了

标签: javascript regex


【解决方案1】:

从索引 1 中获取匹配组。

(?:Block\[)([^\]]*)(?:\]\[value\])

DEMO


或者在你的正则表达式中做一些改变

(?:Block\[)(.*)(?:\]\[value])

DEMO

【讨论】:

    【解决方案2】:

    正则表达式:(DEMO)

    (?:Block\[)(.*)(?:\]\[value])
    

    获取内容:

    string = "Block[first_name][value]";
    result = string.match((/?:Block\[)(.*)(?:\]\[value])/, g);
    console.log(result[1]); //first_name
    

    【讨论】:

      【解决方案3】:

      问题是.* 吃掉了尽可能多的字符。改为使用非贪婪量词和捕获组:

      Block\[(.*?)\]
      

      如果你也需要捕获值,你可以使用这个表达式:

      Block\[(.*?)\]\[(.*?)\]
      

      编辑:还有 JS...

      var re = /Block\[(.*?)\]\[(.*?)\]/g;
      var match;
      while(match = re.exec("Block[first_name][value] Block[last_name][value]")) {
          console.log("Found " + match[1] + " with value: " + match[2]);
      }
      

      【讨论】:

        最近更新 更多