2017-03-03 65 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