【问题标题】:RegEx - Value inside double square bracketsRegEx - 方括号内的值
【发布时间】:2014-11-11 03:13:48
【问题描述】:

我试图在双方括号中提取一个值:[[x]],同时忽略单方括号中的所有其他内容:[y]

注意:此正则表达式用于 JavaScript,据我了解不支持向后看

例如取这3个字符串

[[32]] [Test] Lorem Ipsum
[[16]] Lorem Ipsum
[[2]] Test [BUG]

我要提取:32,16,2

这是我尝试过的

测试 1:

\[([0-9]+)\]

http://www.regexr.com/39sm3

将只返回包含内部方括号的值,例如[32]、[16]、[2]。然后我可以对结果再做一次正则表达式,但我想知道如何做一次。

测试 2:

\[.*?\]]

http://www.regexr.com/39sm0

将返回带有双方括号的值,例如[[32]]、[[16]]、[[2]]

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    给定:

    var s = '[[32]] [Test] Lorem Ipsum [[16]] Lorem Ipsum [[2]] Test [BUG]';
    

    您可以使用匹配一个或多个数字后跟“]]”但不包括“]]”的预读:

    s.match(/\d+(?=\]\])/g)  // ["32", "16", "2"]
    

    或者,如果前瞻不可用,您可以使用:

    s.match(/\[\[(\d+)\]\]/g).map(function(v){return v.replace(/\[+|\]+/g,'');})
    

    虽然如果 map 可用,那么前瞻可能也是。如果输入是多行的,你可能还需要 m 标志。

    【讨论】:

    • 谢谢!这正是我想要的。
    • 但这不会匹配像foo123]] 这样没有前导双方括号的模式吗?
    • @torazaburo 做一些测试,是的,但在我的情况下,我只是简单地包装了一个 if 条件,以测试字符串的 indexOf [[]]。因为这是针对 JavaScript 的,所以我不能使用 Lookbehind。
    【解决方案2】:

    您可以使用捕获组来匹配模式中的子字符串。

    在 JavaScript 中(括号在这里定义了捕获组):

    var pattern = /\[\[([0-9]+)\]\]/g;
    var string = "[[1]] [2] [[3]] [4] [[five]]";    
    var numbers = [];
    
    while (match = pattern.exec(string)) {
        numbers.push(match[1]); //Get capturing group 1. This would be e.g. "1"
        // NOTE: match[0] contains the entire match. e.g. "[[1]]"
    }
    console.log(numbers)
    

    控制台输出:["1", "3"]

    有关捕获组的更多信息,请参阅http://www.regular-expressions.info/refcapture.html

    【讨论】:

      【解决方案3】:

      怎么样

      \[{2}(\d+)\]{2}
      

      告诉正则表达式你想要{2}[然后是一些\d数字然后是另一个{2}]

      【讨论】:

        【解决方案4】:

        你试过/\[\[([0-9]+)\]\]/吗?当然,假设您只期望双方括号内的数字。

        var exp = /\[\[([0-9]+)\]\]/;
        var number = exp.exec("[[293]] Test line")[1]
        

        number 应该返回 '293'

        【讨论】:

        • 返回["[[32]]", "[[16]]", "[[2]]"],不是OP想要的(如帖子中所述)。
        • 不过,捕获组应该具有正确的值。让我再确认一下。
        • 谢谢@nhahtdh,我很粗心。
        【解决方案5】:
        let str = 'test [[1]], test [[2]], xyz, abc, &nbsp; <p>Hi</p> test [[3]].'
        
        let result = str.match(/\[\[(\d+)\]\]/g).map((item) => {
            return parseInt(item.replace(/[\[\]]/g, ''))
        })
        
        console.log(result)
        

        【讨论】:

        【解决方案6】:

        使用纯正则表达式的另一种方法是使用环视。

        (?<=\[\[)[0-9]+(?=\]\])
        

        【讨论】:

        • 感谢您的回复。这看起来很棒,但是我需要在 JavaScript 中使用它,遗憾的是它不支持 Lookbehinds。我会更新这个问题,因为这可能仅从标签中并不明显。
        • 啊,我的错,对不起。尽管看起来您已经收到了合适的答案,但这确实使事情变得更加困难。感谢您的回复。
        猜你喜欢
        • 2010-10-18
        • 1970-01-01
        • 2021-10-05
        • 1970-01-01
        • 2017-12-09
        • 2018-12-28
        • 2016-12-08
        • 1970-01-01
        • 2019-01-04
        相关资源
        最近更新 更多