regex 需要正则表达式来捕获编号引用

wgx48brx  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(100)

我有一份带有IEEE风格引文或括号中数字的文档。它们可以是一个数字,如[23],或几个,如[5,7,14],或一个范围,如[12-15]。
我现在有[\[|\s|-]([0-9]{1,3})[\]|,|-]
这是捕获单个数字和组中的第一个数字,但不捕获后续数字或范围中的任何一个数字。然后我需要在一个像\1这样的表达式中引用这个数字。

hyrbngr7

hyrbngr71#

这个怎么样?
(\[\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]!

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

vc6uscn9

vc6uscn92#

我认为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>]'
*/

相关问题