【问题标题】:Regex to get string between curly braces正则表达式获取花括号之间的字符串
【发布时间】:2010-09-29 14:37:50
【问题描述】:

不幸的是,尽管我在记忆中已经尝试每年至少学习一次正则表达式,但我总是忘记,因为我很少使用它们。今年我的新年决心是不再尝试学习正则表达式 - 所以今年为了让我免于流泪,我将把它交给 Stack Overflow。 (去年圣诞节混音)。

我想传入{getThis}这种格式的字符串,并返回字符串getThis。谁能帮助我坚持我的新年决心?


有关 Stack Overflow 的相关问题:

【问题讨论】:

标签: javascript regex


【解决方案1】:

试试

/{(.*?)}/

这意味着,匹配 { 和 } 之间的任何字符,但不要贪心 - 匹配以 } 结尾的最短字符串(? 停止 * 贪心)。括号可让您提取匹配的部分。

另一种方法是

/{([^}]*)}/

这匹配除 } 字符之外的任何字符(另一种不贪心的方式)

【讨论】:

  • 这很好,但是是否可以匹配可变数量的花括号组合之间的任何内容?例如:“{这应该匹配}这不应该{这有点应该再次}等等{on}”?我想检索不在大括号内的值。另外:句子中不会使用大括号,也没有堆叠(这永远不会发生:“{some {text}}”)。任何人都知道如何做到这一点:)?谢谢! (ps:赞成这个解决方案)
  • 它不会捕获大括号之间的所有内容,它会捕获大括号和大括号本身之间的所有内容。您将如何仅捕获大括号内的内容?
  • 我喜欢你不需要在这里转义大括号,因为正则表达式解析器似乎意识到它们不是量词......好吧,我在 python 中这样做,但我认为 javascript 正则表达式也可以这样工作
  • 在末尾添加g 使其成为全局搜索。见working example
  • @Reality-Torrent,如果我指定 g 选项来获取所有匹配项,我也看到它捕获了大括号。原来我应该在循环中使用 Regex.exec 而不是 Javascript 中的 string.match 以同时具有 g 标志并允许捕获组。见developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
【解决方案2】:

如果你的字符串总是采用这种格式,那么正则表达式就大材小用了:

>>> var g='{getThis}';
>>> g.substring(1,g.length-1)
"getThis"

substring(1 表示从一个字符开始(刚刚超过第一个 {),,g.length-1) 表示将字符直到(但不包括)字符串长度减一的字符。这是有效的,因为该位置是从零开始的,即g.length-1 是最后一个位置。

对于原始海报以外的读者:如果它必须是一个正则表达式,如果你想允许空字符串,请使用/{([^}]*)}/,或者如果你想只在存在时匹配,请使用/{([^}]+)}/是大括号之间的至少一个字符。细分:

  • /:启动正则表达式模式
    • {:字面大括号
      • (:开始抓包
        • [:开始定义要捕获的一类字符
          • ^}: "} 以外的任何东西"
        • ]:好的,这就是我们整个类的定义
        • *: 任意数量的字符匹配我们刚刚定义的那个类
      • ):抓拍完成
    • }:大括号必须紧跟我们捕获的内容
  • /: 结束正则表达式模式

【讨论】:

  • 子字符串是根据您使用的语言而改变的事情之一。Javascript 采用索引停止,PHP 采用所需最终结果的长度(除非它是负数,在这种情况下它取要删除的字符数),C# 又不同了……很好而且令人困惑。
  • ...而 Python 只是切片,IMO 比其他任何东西都好:p。
  • 很好,但不确定这是一个正则表达式。也许他在问正则表达式,而我来这里是为了同样的答案.. 遗憾的是答案与问题无关..
  • @baash05,如果您阅读了整个问题,OP 甚至都不想学习正则表达式,所以我不认为这是您所暗示的学术练习。
  • 我想做-1,因为问题是要求 regex,我正在搜索 regex,但接受的答案对我(虽然这个问题本身看起来很有希望)。在阅读了第一条评论后,我必须承认,如果我先回答这个问题,我本可以以相同/相似的方式回答......所以最后,+1。
【解决方案3】:
/\{([^}]+)\}/

/        - delimiter
\{       - opening literal brace escaped because it is a special character used for quantifiers eg {2,3}
(        - start capturing
[^}]     - character class consisting of
    ^    - not
    }    - a closing brace (no escaping necessary because special characters in a character class are different)
+        - one or more of the character class
)        - end capturing
\}       - the closing literal brace
/        - delimiter

【讨论】:

  • @meouw sa = s.split("/\{([^}]+)\}/");给出编译错误。非法重复,无效转义字符。
  • @Anil 您似乎使用字符串作为拆分参数,而不是正则表达式。你想做什么?
【解决方案4】:

这个适用于 Textmate,它匹配大括号之间的 CSS 文件中的所有内容。

\{(\s*?.*?)*?\}

selector {. . matches here including white space. . .}

如果您希望进一步能够返回内容,则将其全部包装在一组括号中,如下所示:

\{((\s*?.*?)*?)\}

您可以通过 $1 访问内容。

这也适用于函数,但我没有使用嵌套大括号对其进行测试。

【讨论】:

    【解决方案5】:

    您想使用正则表达式前瞻和后瞻。这只会为您提供花括号内的内容:

    (?<=\{)(.*?)(?=\})
    

    【讨论】:

    • 应该有一个反斜杠转义上面的花括号。他们在我的提交中被剥离了。
    • 谢谢,今天这对我有帮助。
    • 这种方法有什么缺点吗?
    • @Somatik — 是的,ECMAScript 不支持负前瞻和后瞻。
    • 注意:此示例适用于 Java。返回所有花括号中的所有值。
    【解决方案6】:

    这是一个使用 javascript replace 的简单解决方案

    var st = '{getThis}';
    
    st = st.replace(/\{|\}/gi,''); // "getThis"
    

    正如上面公认的答案指出,原来的问题很容易用子字符串解决,但使用替换可以解决更复杂的用例

    如果你有一个像 "randomstring999[fieldname]" 这样的字符串 您使用稍微不同的模式来获取字段名

    var nameAttr = "randomstring999[fieldname]";
    
    var justName = nameAttr.replace(/.*\[|\]/gi,''); // "fieldname"
    

    【讨论】:

      【解决方案7】:
      var re = /{(.*)}/;
      var m = "{helloworld}".match(re);
      if (m != null)
          console.log(m[0].replace(re, '$1'));
      

      如果正则表达式不匹配,不幸的是,更简单的.replace(/.*{(.*)}.*/, '$1') 会返回整个字符串。上面的代码 sn -p 可以更容易地检测到匹配。

      【讨论】:

        【解决方案8】:

        用于获取带花括号的字符串数组的正则表达式出现在字符串中,而不是仅仅找到第一次出现。

         /\{([^}]+)\}/gm 
        

        【讨论】:

          【解决方案9】:

          试试这个,根据http://www.regextester.com 它适用于 js 正常。

          ([^{]*?)(?=\})

          【讨论】:

          • 多选可以使用/([^{]*?)\w(?=\})/gmi
          【解决方案10】:

          试试这个:

          /[^{\}]+(?=})/g
          

          例如

          Welcome to RegExr v2.1 by #{gskinner.com},  #{ssd.sd} hosted by Media Temple!
          

          将返回gskinner.comssd.sd

          【讨论】:

          • 太好了,你能解释一下为什么你在第一个块中使用\} 吗?
          • 不错,但它会匹配任何以} 结尾的组,即使它不以{ 开头。
          • 这是唯一有效的正确答案。
          • 解释:虽然 [^\{\}]+ 将匹配任何不是大括号的内容,但前瞻断言 (?=}) 将确保只传递大括号之前的部分。使用 / ... /g 我们得到所有的出现,而不仅仅是第一个。
          【解决方案11】:

          我已经查看了其他答案,但其中似乎缺少重要的逻辑。即,选择两个连续括号之间的所有内容,但不要选择括号

          所以,这是我的答案

          \{([^{}]+)\}
          

          【讨论】:

            【解决方案12】:

            您可以使用此正则表达式递归来匹配两者之间的所有内容,甚至是另一个 {}(如 JSON 文本):

            \{([^()]|())*\}
            

            【讨论】:

            • 不错,但这仅捕获嵌套大括号内的内容
            • 如果内容包含()则不捕获
            【解决方案13】:

            试试这个

            let path = "/{id}/{name}/{age}";
            const paramsPattern = /[^{\}]+(?=})/g;
            let extractParams = path.match(paramsPattern);
            console.log("extractParams", extractParams) // prints all the names between {} = ["id", "name", "age"]
            

            【讨论】:

            • 正是我想要的 :) 这将返回不带括号的结果,其他解决方案也随之返回
            • 很好,这里的最佳答案。
            【解决方案14】:

            即使这有助于我解决某人的问题,

            拆分花括号 ({}) 内的内容,其模式如下: {'day': 1, 'count': 100}.

            例如:

            #include <iostream> 
            #include <regex> 
            #include<string> 
            using namespace std; 
            
            int main() 
            { 
                //string to be searched
                string s = "{'day': 1, 'count': 100}, {'day': 2, 'count': 100}";
            
                // regex expression for pattern to be searched 
                regex e ("\\{[a-z':, 0-9]+\\}");
                regex_token_iterator<string::iterator> rend;
            
                regex_token_iterator<string::iterator> a ( s.begin(), s.end(), e );
                while (a!=rend) cout << " [" << *a++ << "]";
                cout << endl;
            
                return 0; 
            }
            

            输出:

            [{'day': 1, 'count': 100}] [{'day': 2, 'count': 100}]
            

            【讨论】:

              【解决方案15】:

              这个匹配所有内容,即使它在中间找到多个右花括号:

              \{([\s\S]*)\}

              例子:

              {
                "foo": {
                  "bar": 1,
                  "baz": 1,
                }
              }
              

              【讨论】:

                猜你喜欢
                • 2015-07-05
                • 1970-01-01
                • 1970-01-01
                • 2011-07-17
                • 1970-01-01
                • 2013-07-20
                • 2018-07-30
                相关资源
                最近更新 更多