一位正则表达式新手......抱歉。我有一个带有IEEE格式引文的文档,或括号中的数字。它们可以是[23]中的一个数字,或者[5,7,14]中的几个,或者[12-15]中的一个范围。需要一个正则表达式来捕获编号引用
我现在拥有的是[\[|\s|-]([0-9]{1,3})[\]|,|-]
。
这是捕获单个数字和组中的第一个数字,但不包括后续数字或范围内的任何数字。 然后,我需要在像\1
这样的表达式中引用该数字。
我希望这是明确的!我怀疑我不懂OR操作符。
一位正则表达式新手......抱歉。我有一个带有IEEE格式引文的文档,或括号中的数字。它们可以是[23]中的一个数字,或者[5,7,14]中的几个,或者[12-15]中的一个范围。需要一个正则表达式来捕获编号引用
我现在拥有的是[\[|\s|-]([0-9]{1,3})[\]|,|-]
。
这是捕获单个数字和组中的第一个数字,但不包括后续数字或范围内的任何数字。 然后,我需要在像\1
这样的表达式中引用该数字。
我希望这是明确的!我怀疑我不懂OR操作符。
这个怎么样?
(\[\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]!
空格被不考虑,但如果你需要
你可以将它们添加我认为吉姆的答案是有帮助的,但一些推广和编码更好理解:
如果问题一直在寻找更复杂,但是可能一个像[1,3-5]
:
(\[\d+(,\s?\d+|\d*-\d+)*\])
^^^^ optional space after ','
//validates:
[3,33-24,7]
[3-34]
[1,3-5]
[1]
[1, 2]
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 – MohaMad
''''里面'[']'与一个文字管道符号相匹配。 –
它似乎已经抛弃了我的正则表达式......我现在拥有的是“[\ [| \ s | - ]([0-9] {1,3})[\] |,| - ]” –
是的,你的模式是一团糟。将样例输入和预期输出发布到使用正则表达式的代码中。 –