我正在尝试创建一个Java正则表达式来识别一个数字(直到执行时我才知道)是否在一个范围内(而这个范围直到执行时我才知道)。
具体地说,我尝试使用Cisco的PRIME合规性模块来验证我的交换机没有非活动的VLAN (对于这个问题,VLAN只是一个数字),但PRIME使用Java正则表达式语法。
我知道我正在评估的特定switch命令使用如下语法:
switchport trunk allowed vlan 1,20,37,45,90-101,300-502,904-2044
那么,我如何判断VLAN "x“是否在这些范围内?
有什么想法吗?
编辑:不幸的是,列出的RegEx here是针对已知范围的;示例都是硬编码的范围。我需要一些未知的x,y和z,其中所有的x,y和z可能是1,2,3,或4位数字,并且当z写成"x-y“时匹配在x和y之间。
有没有办法将字符串"x-y“解析为被理解为数字的\1和\2,并匹配if (z >= \1 && z <= \2)?
我曾经尝试过前视和后视以及疯狂/模糊的Java兼容的正则表达式结构,但是我的头脑很快就进入了第四个维度。
发布于 2018-08-24 04:29:15
我认为这不应该用正则表达式来完成。就我个人而言,我会使用正则表达式来检查它的格式是否正确,即检查字符串是否与"VLAN ([0-9]+(-[0-9]+)?)(,([0-9]+(-[0-9]+)?))*"
匹配,然后在逗号上拆分后半部分,并从那里使用整数解析,这取决于其中是否有'-‘,您可以检查范围。
例如:https://jsfiddle.net/gcb9pm7f/15/
function testRanges()
{
var str = document.getElementById("textField").value;
var test = parseInt(document.getElementById("numberField").value);
str = str.toUpperCase(); // VLAN big
var regex = /^VLAN ([0-9]+(-[0-9]+)?)(,([0-9]+(-[0-9]+)?))*$/g;
if (regex.test(str))
{
str = str.substring(5, str.length); // remove 'VLAN'
var splitArray = str.split(',');
for (var idx = 0; idx < splitArray.length; idx++)
{
var rangeStr = splitArray[idx];
if (rangeStr.includes('-'))
{
// range, check both values.
var a = parseInt(rangeStr.split('-')[0]);
var b = parseInt(rangeStr.split('-')[1]);
if (a > b)
{
if (test >= b && test <= a) return true; // range is inclusive
}
else // a <= b
{
if (test <= b && test >= a) return true; // range is inclusive
}
}
else // not a range, single value
{
if (parseInt(rangeStr) === test) return true;
}
}
}
return false; // no match or regex not matching.
}
根据需要调整到您的编程语言。应该是相当直接的。
https://stackoverflow.com/questions/51992990
复制相似问题