2017-03-03 64 views
-1

一位正则表达式新手......抱歉。我有一个带有IEEE格式引文的文档,或括号中的数字。它们可以是[23]中的一个数字,或者[5,7,14]中的几个,或者[12-15]中的一个范围。需要一个正则表达式来捕获编号引用

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

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

我希望这是明确的!我怀疑我不懂OR操作符。

+0

''''里面'[']'与一个文字管道符号相匹配。 –

+0

它似乎已经抛弃了我的正则表达式......我现在拥有的是“[\ [| \ s | - ]([0-9] {1,3})[\] |,| - ]” –

+0

是的,你的模式是一团糟。将样例输入和预期输出发布到使用正则表达式的代码中。 –

回答

1

这个怎么样?

(\[\d+\]|\[\d+-\d+\]|\[\d+(,\d+)*\])
其实这可以更siplified到:(\[\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]! 

空格被不考虑,但如果你需要

你可以将它们添加
0

我认为吉姆的答案是有帮助的,但一些推广和编码更好理解:

  • 如果问题一直在寻找更复杂,但是可能一个像[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

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>]' 
*/ 
+0

感谢所有的答案,以及进入他们的想法。我搜索了以前提交的答案,每个Wiktor的评论,但还没有找到它... –

+0

我不认为我明确表示,我试图提取每个一到三位数字,分开。 –

+0

当你用正则表达式找到'[1,2]'时,尝试分解它并解析你的链接。这个替换的代码添加到我的答案。我希望它能帮助你。 @PeterBasch – MohaMad