Javascript 为什么以下字符串中大于17的值匹配?
为什么大于17的值在以下字符串中匹配Javascript 为什么以下字符串中大于17的值匹配?,javascript,regex,Javascript,Regex,为什么大于17的值在以下字符串中匹配 "1,2,17,18,19,181111".match(/^\b((1[0-7]|[1-9])\,?)+$/g ) 可以使用非正则表达式解决方案 var inputStr = "1,2,17,18,19,181111"; var output = inputStr.split( "," ).filter( s => +s <= 17 ); var inputStr=“1,2,17,18,19181111”; var output=i
"1,2,17,18,19,181111".match(/^\b((1[0-7]|[1-9])\,?)+$/g )
可以使用非正则表达式解决方案
var inputStr = "1,2,17,18,19,181111";
var output = inputStr.split( "," ).filter( s => +s <= 17 );
var inputStr=“1,2,17,18,19181111”;
var output=inputsr.split(“,”).filter(s=>+s+s可以使用非正则表达式解决方案
var inputStr = "1,2,17,18,19,181111";
var output = inputStr.split( "," ).filter( s => +s <= 17 );
var inputStr=“1,2,17,18,19181111”;
变量输出=inputStr.split(“,”).filter(s=>+s+s
var inputStr=“1,2,17,18,19181111”;
const output=inputStr.split(',')。filter(number=>parseInt(number)<17)。join(',');
console.log(输出)
var inputStr=“1,2,17,18,19181111”;
const output=inputStr.split(',')。filter(number=>parseInt(number)<17)。join(',');
log(输出)
刚才,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个。刚才,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。您要查找的正则表达式如下所示:
(?<=^|,)(1[0-7]|\d)(?=,|$)
(?您要查找的正则表达式如下所示:
(?<=^|,)(1[0-7]|\d)(?=,|$)
(?您的正则表达式非常接近,但问题是逗号是可选的匹配,它允许正则表达式跨先前匹配的数字进行匹配。单词边界或\b
应该是组的一部分,以确保您只匹配完整的数字:
^(?:\b(?:1[0-7]|[1-9])\,?)+$
请注意,旧的faishoned展开正则表达式仍然会表现得更好:
^(?:1[0-7]|[1-9])(?:,(?:1[0-7]|[1-9]))*$
您的正则表达式非常接近,但问题是逗号是可选的匹配项,它允许正则表达式跨先前匹配的数字进行匹配。单词边界或\b
应该是组的一部分,以确保您只匹配完整的数字:
^(?:\b(?:1[0-7]|[1-9])\,?)+$
请注意,旧的faishoned展开正则表达式仍然会表现得更好:
^(?:1[0-7]|[1-9])(?:,(?:1[0-7]|[1-9]))*$
这里有两个选项,一个使用数组过滤器,另一个使用正则表达式
使用regex时,需要使用单词边界(\b
)并设置值0-9(第一个选项)或[0-1][0-7](不需要20,21..)
我不知道你的想法是什么,但我强烈建议在这种情况下使用数组“filter”而不是正则表达式
/“1,2,17,18,19181111”。匹配(/^\b((1[0-7]|[1-9])\,?)+$/g)
//没有正则表达式
const result=“1,2,17,18,19181111”
.split(“,”)
.filter(i=>parseInt(i)这里有两个选项,一个使用数组过滤器,另一个使用正则表达式
使用regex时,需要使用单词边界(\b
)并设置值0-9(第一个选项)或[0-1][0-7](不需要20,21..)
我不知道你的想法是什么,但我强烈建议在这种情况下使用数组“filter”而不是正则表达式
/“1,2,17,18,19181111”。匹配(/^\b((1[0-7]|[1-9])\,?)+$/g)
//没有正则表达式
const result=“1,2,17,18,19181111”
.split(“,”)
.filter(i=>parseInt(i),因为逗号是可选的匹配项inputStr.split(“,”).filter(s=>+s这与Perl或PCRE有什么关系?你可以使用这个正则表达式:@anubhava谢谢。它起作用了。如果你愿意的话,也许你可以写一个详细的答案来解释为什么我的不起作用以及你的(看起来很复杂!)成功。答案将是未来的。因为逗号是可选的匹配项inputStr.split(“,”)。过滤器(s=>+s这与Perl或PCRE有什么关系?你可以使用这个正则表达式:@anubhava谢谢。它成功了。如果你愿意,也许你可以写一个详细的答案,解释为什么我的不起作用以及你的(看起来非常复杂!)有效。答案将是未来的。很好,谢谢:)但我想有一个正则表达式解决方案:)@edam当然可以,试试anubhava的解决方案。当你匹配数值时,regex是一个错误的工具。@Sobrique实际上它是一个逗号分隔的数字列表,其中的数字不能超过17。所以它本质上是一个字符串。但regex不“做”数值。它做文本模式。很好,谢谢:)但我想要一个正则表达式解决方案:)@edam当然,试试anubhava的解决方案。当你匹配数值时,正则表达式是一个错误的工具。@Sobrique实际上它是一个逗号分隔的数字列表,其中任何数字都不能超过17。因此它本质上是一个字符串。但正则表达式不“做”数值。它有文本模式。您的live示例匹配字符串中的所有内容!但我希望不会有大于17的数字匹配!它有。当您的示例是多行字符串时,您只需在regex so^的末尾添加/m标志,$匹配每行的开头/结尾:/(?您的实时示例匹配字符串中的所有内容!但我希望不会有大于17的数字匹配!确实如此。当您的示例是多行字符串时,您只需在正则表达式的末尾添加/m标志,因此,^,$匹配每行的开头/结尾:/(?非常好的答案:)非常好的答案:)