【问题标题】:Need a regex to capture numbered citations [duplicate]需要一个正则表达式来捕获编号的引用[重复]
【发布时间】:2017-03-03 20:09:35
【问题描述】:

有点正则表达式新手...对不起。我有一份带有 IEEE 风格引文或括号中数字的文档。它们可以是一个数字,如 [23],或多个,如 [5, 7, 14],或一个范围,如 [12-15]。

我现在拥有的是[\[|\s|-]([0-9]{1,3})[\]|,|-]

这是捕获单个数字和组中的第一个数字,但不捕获后续数字或范围内的任何一个数字。 然后我需要在 \1 这样的表达式中引用该数字。

我希望这很清楚!我怀疑我不懂 OR 运算符。

【问题讨论】:

  • | inside [...] 匹配文字管道符号。
  • 它似乎破坏了我的正则表达式......我现在拥有的是 "[[|\s|-]([0-9]{1,3})[]|,|- ]"
  • 是的,你的模式一团糟。发布您使用正则表达式的代码,以及示例输入和预期输出。
  • 可以接受像 [1, 3-5] 这样的组合吗? @PeterBasch
  • @MohaMad,是的,这是可以接受的。在一个范围内,我只需要匹配第一个数字(连字符之前的那个)。这个想法是我将数字链接到参考书目中的特定参考。再次感谢您帮助我解决这个问题!

标签: regex citations


【解决方案1】:

这个怎么样?

(\[\d+\]|\[\d+-\d+\]|\[\d+(,\d+)*\])
实际上,这可以更简化为:(\[\d+-\d+\]|\[\d+(,\d+)*\])

my @test = (  
    "[5,7,14]",  
    "[23]",  
    "[12-15]"  
);  

foreach my $val (@test) {  
    if ($val =~ /(\[\d+-\d+\]|\[\d+(,\d+)*\])/ ) {  
        print "match $val!\n";  
    }  
    else {  
        print "no match!\n";  
    }  
}   

这打印:

match [5,7,14]!  
match [23]!  
match [12-15]! 

不考虑空格,但如果需要,您可以添加它们

【讨论】:

    【解决方案2】:

    我认为 Jim 的回答很有帮助,但为了更好地理解,需要进行一些概括和编码:

    • 如果 Questions 正在寻找更复杂但可能的问题,例如 [1,3-5]

      (\[\d+(,\s?\d+|\d*-\d+)*\])
             ^^^^ optional space after ','
      //validates:
      [3,33-24,7]
      [3-34]
      [1,3-5]
      [1]
      [1, 2]
      

    Demo for this Regex

    用链接替换 ​​digits 的 JavaScript 代码:

    //define input string:
    var mytext = "[3,33-24,7]\n[3-34]\n[1,3-5]\n[1]\n[1, 2]" ;
    
    //call replace of matching [..] that calls digit replacing it-self
    var newtext = mytext.replace(/(\[\d+(,\s?\d+|\d*-\d+)*\])/g ,
        function(ci){ //ci is matched citations `[..]`
            console.log(ci);
            //so replace each number in `[..]` with custom links
            return ci.replace(/\d+/g, 
                function(digit){
                    return '<a href="/'+digit+'">'+digit+'</a>' ;
                });
        });
    console.log(newtext);
    
    /*output:
    '[<a href="/3">3</a>,<a href="/33">33</a>-<a href="/24">24</a>,<a href="/7">7</a>]
    [<a href="/3">3</a>-<a href="/34">34</a>]
    [<a href="/1">1</a>,<a href="/3">3</a>-<a href="/5">5</a>]
    [<a href="/1">1</a>]
    [<a href="/1">1</a>, <a href="/2">2</a>]'
    */
    

    【讨论】:

    • 感谢所有的答案,以及他们的想法。根据 Wiktor 的评论,我搜索了先前提交的答案,但尚未找到...
    • 我认为我没有明确表示我正在尝试分别提取每个一到三位数的数字。
    • 当您使用正则表达式找到[1, 2] 时,尝试拆分它并解析您的链接。此替换的示例代码已添加到我的答案中。我希望它对你有帮助。 @PeterBasch
    • 感谢您的帮助。当我在探索这个问题时,我越来越擅长寻求帮助。我在这里重新发布了我的问题,措辞更好:stackoverflow.com/questions/42603140/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2015-03-13
    相关资源
    最近更新 更多