我正在尝试制作Java正则表达式,以识别数字(直到执行时间才知道)是否在一个范围内(并且直到执行时间我也不知道该范围)。
特别是,我尝试使用Cisco的PRIME合规性模块来验证我的交换机没有不活动的VLAN(对于这个问题,VLAN只是一个数字),但是PRIME使用Java正则表达式语法。
我知道我正在评估的特定切换命令使用的语法如下:
switchport trunk allowed vlan 1,20,37,45,90-101,300-502,904-2044
那么,如何确定VLAN“ x”是否在那些范围内?
有什么想法吗?
编辑:不幸的是,列出的here的RegEx适用于已知范围;这些示例都是硬编码范围。我需要一个未知的x,y和z,其中所有x,y和z都可能是1、2、3或4位数字,并且当z表示为x和y之间时,如果匹配为“ xy”,则匹配。
是否可以采用字符串“ xy”,将其解析为\ 1和\ 2(它们被理解为数字),并匹配if(z> = \ 1 && z <= \ 2)?
我曾经尝试着研究诸如lookahead和lookbehind以及疯狂/模糊的Java兼容正则表达式结构之类的东西,但是我的头很快就陷入了第四维度。
答案 0 :(得分:1)
我不认为这应该使用正则表达式来完成。就个人而言,我将使用正则表达式检查其格式是否正确,即检查字符串是否与"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.
}
根据需要调整您的编程语言。应该相当简单。