为什么以下字符串中大于17的值匹配?

时间:2018-01-24 14:44:25

标签: javascript regex

为什么大于17的值在以下字符串中匹配?

    "1,2,17,18,19,181111".match(/^\b((1[0-7]|[1-9])\,?)+$/g )

6 个答案:

答案 0 :(得分:3)

你的正则表达式非常接近,但问题是逗号是一个可选匹配,它允许正则表达式匹配前一个匹配的数字。单词边界或\b应该是该组的一部分,以确保您只匹配完整的数字:

^(?:\b(?:1[0-7]|[1-9])\,?)+$

RegEx Demo

请注意,旧的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;而不是这种情况的正则表达式。

&#13;
&#13;
//    "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;
&#13;
&#13;