Java正则表达式可匹配范围内的数字

时间:2018-08-23 19:26:44

标签: java regex range

我正在尝试制作Java正则表达式,以识别数字(直到执行时间才知道)是否在一个范围内(并且直到执行时间我也不知道该范围)。

特别是,我尝试使用Cisco的PRIME合规性模块来验证我的交换机没有不活动的VLAN(对于这个问题,VLAN只是一个数字),但是PRIME使用Java正则表达式语法。

我知道我正在评估的特定切换命令使用的语法如下:

switchport trunk allowed vlan 1,20,37,45,90-101,300-502,904-2044

那么,如何确定VLAN“ x”是否在那些范围内?

  • 如果x = 20,则应该匹配。
  • 如果x = 90,则应该匹配。
  • 如果x = 900,则应该失败。
  • 如果x = 1043,则应该匹配。

有什么想法吗?

编辑:不幸的是,列出的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兼容正则表达式结构之类的东西,但是我的头很快就陷入了第四维度。

1 个答案:

答案 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.
}

根据需要调整您的编程语言。应该相当简单。