为什么大于17的值在以下字符串中匹配?
"1,2,17,18,19,181111".match(/^\b((1[0-7]|[1-9])\,?)+$/g )
答案 0 :(得分:3)
你的正则表达式非常接近,但问题是逗号是一个可选匹配,它允许正则表达式匹配前一个匹配的数字。单词边界或\b
应该是该组的一部分,以确保您只匹配完整的数字:
^(?:\b(?:1[0-7]|[1-9])\,?)+$
请注意,旧的faishoned unrolled regex,因为这个仍将表现更好:
^(?:1[0-7]|[1-9])(?:,(?:1[0-7]|[1-9]))*$
答案 1 :(得分:2)
非正则表达式解决方案可能
var inputStr = "1,2,17,18,19,181111";
var output = inputStr.split( "," ).filter( s => +s <= 17 );
<强>演示强>
var inputStr = "1,2,17,18,19,181111";
var output = inputStr.split( "," ).filter( s => +s <= 17 );
console.log( output );
答案 2 :(得分:0)
var inputStr = "1,2,17,18,19,181111";
const output = inputStr.split(',').filter(number => parseInt(number) < 17).join(',');
console.log(output)
答案 3 :(得分:0)
刚才,Perl标签还在那里......
$ perl -wE '$s = "1,2,17,18,19,181111";
say $1 while $s =~ /\G(1[0-7]|[1-9])(?:,|$)/g'
1
2
17
\ G匹配最后一场比赛停止的位置,因此您无法支持,例如跳过1811并匹配最后的11。
答案 4 :(得分:0)
您正在寻找的正则表达式如下:
(?<=^|,)(1[0-7]|\d)(?=,|$)
在res folder view的实时示例中,您可以看到它是如何工作的。您正在寻找1后跟1-7或由字符串的开头(^
)或左侧的逗号和字符串的末尾($
)包围的任何单个数字或右边有一个逗号。
你的正则表达式不是你想要的,因为在说((1[0-7]|[0-9])\,?)+
时你匹配一个或多个可能后面跟一个逗号的单个数字。
答案 5 :(得分:0)
这里有两个选项,一个使用数组过滤器,另一个使用正则表达式。
使用正则表达式,您需要使用单词边界(\b
)并设置值0-9(第一个选项)或[0-1] [0-7](您不希望20 ,21 ...)。
我不确定您的想法是什么,但我强烈推荐数组&#39;过滤&#39;而不是这种情况的正则表达式。
// "1,2,17,18,19,181111".match(/^\b((1[0-7]|[1-9])\,?)+$/g )
// Without regex
const result = "1,2,17,18,19,181111"
.split(',')
.filter(i => parseInt(i) <= 17);
// With regex
const regexResult = "1,2,17,18,19,181111"
.match(/\b([0-9]|([0-1][0-7]))\b/g);
console.log(result);
console.log(regexResult)
&#13;