【问题标题】:javascript, regex parse string content in curly bracketsjavascript,正则表达式解析大括号中的字符串内容
【发布时间】:2012-04-05 06:03:06
【问题描述】:

我是正则表达式的新手。我正在尝试解析字符串中大括号内的所有内容。我查找了this post 作为参考,并完全按照其中一个答案的建议进行操作,但是结果出乎意料。

这就是我所做的

var abc = "test/abcd{string1}test{string2}test" //any string
var regex = /{(.+?)}/
regex.exec(abc) // i got ["{string1}", "string1"]
             //where i am expecting ["string1", "string2"]

我想我错过了什么,我做错了什么?

更新

我可以通过/g 获得它以进行全局搜索

var regex = /{(.*?)}/g
abc.match(regex) //gives ["{string1}", "{string2}"]

我怎样才能得到不带括号的字符串?

【问题讨论】:

    标签: javascript regex string-parsing


    【解决方案1】:
    "test/abcd{string1}test{string2}test".match(/[^{}]+(?=\})/g)
    

    生产

    ["string1", "string2"]
    

    它假定每个} 前面都有一个对应的{ 并且{...} 部分不嵌套。它也不会捕获空的{} 部分的内容。

    【讨论】:

    • 这很好。但是您不需要转义右大括号。 /[^{}]+(?=})/g
    【解决方案2】:
    var abc = "test/abcd{string1}test{string2}test" //any string
    var regex = /{(.+?)}/g
    var matches;
    
    while(matches = regex.exec(abc))
        console.log(matches);
    

    【讨论】:

      【解决方案3】:

      试试这个:

      var abc = "test/abcd{string1}test{string2}test" //any string
      var regex = /{(.+?)}/g //g flag so the regex is global
      abc.match(regex) //find every match
      

      在 javascript 中阅读 Regex 的好地方是 here,而测试的好地方是 here

      祝你好运!

      【讨论】:

      • 我不认为 g 在这里会有所作为。它没有得到第二个匹配项(string2),因为它只调用了一次 exec。
      • @Kash 你是对的,但是我调用了 match,如果没有 g,它将返回 ["{string1}", "string1"]
      【解决方案4】:

      没有错。但是你需要查看你的捕获组(数组中的第二个元素)来获得你想要的内容(你可以忽略第一个)。要获得所有事件,仅运行一次 exec 是不够的,您需要使用 match 循环遍历结果。

      编辑:没关系,你不能用match 访问捕获组。一个更简单的解决方案是使用积极的前瞻性,如 Mike Samuel suggested

      【讨论】:

        【解决方案5】:

        这个结果:

        ["{string1}", "string1"]
        

        向您展示,对于第一个匹配项,整个正则表达式匹配 "{string1}" 并且第一个捕获括号匹配 "string1"

        如果您想获取所有匹配项并查看每个匹配项的所有捕获括号,您可以使用“g”标志并循环,多次调用exec(),如下所示:

        var abc = "test/abcd{string1}test{string2}test"; //any string
        var regex = /{(.+?)}/g;
        var match, results = [];
        while (match = regex.exec(abc)) {
            results.push(match[1]);   // save first captured parens sub-match into results array
        }
        
        // results == ["string1", "string2"]
        

        你可以在这里看到它的工作原理:http://jsfiddle.net/jfriend00/sapfm/

        【讨论】:

        • 条件下的作业......不是我的一杯茶。
        • 这是一种执行此类循环的有效方法,并且对于此确切目的来说有些常见。我通常也会避免它,除非在这种情况下。如果你愿意,你可以多写几行代码来完成同样的事情。
        • 感谢您的解释,我想知道为什么同一个字符串出现两次。谢谢!
        【解决方案6】:

        试试这个文件

        const fs = require('fs');
        
        fs.readFile('logs.txt', function(err, data) {
        if(err) throw err;
        const paragraph = "'" + data + "'";
        const regex = /\d+\<;>\S+\<;>(\d+)\<;/g;
        const found = paragraph.match(regex);
        
        console.log(found);
        })
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-09-15
          • 1970-01-01
          • 1970-01-01
          • 2015-08-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多