用于网络服务端口定义的正则表达式

Regex for network service port definitions

我的同事和我尝试构建一个正则表达式 (Javascript) 来验证特定格式的输入字段。 该字段应该是逗号分隔的端口声明列表,可能如下所示:

TCP/53,UDP/53,TCP/10-20,UDP/20-30

我们试过这个正则表达式:

/^[TCP/\d+,|UDP/\d+,|TCP/\d+\-\d+,|UDP/\d+\-\d+,]*[TCP/\d+|UDP/\d+|TCP/\d+\-\d+|UDP/\d+\-\d+]$/g

正则表达式匹配,但也匹配其他字符串,例如:

TCP/53UDP53,TCP/10-20UDP20-30

感谢您的指导!

您不需要所有这些交替,并且 [ ] 不用于那样的分组。您还可以使用分组 (?:...)?

使 - 和数字部分可选

要匹配该字符串格式:

^(?:TCP|UDP)\/\d+(?:-\d+)?(?:,(?:TCP|UDP)\/\d+(?:-\d+)?)*$

模式匹配:

  • ^ 字符串开头
  • (?:TCP|UDP) 匹配其中一个选项
  • \/\d+(?:-\d+)? 匹配 / 1+ 位和可选的 - 和 1+ 位
  • (?: 非捕获组作为一个整体重复
    • ,(?:TCP|UDP)\/\d+(?:-\d+)? 匹配一个 , 并重复相同的模式
  • )* 关闭非捕获组并可选择重复(如果应该至少有 1 个逗号,请将 * 更改为 +
  • $ 字符串结束

Regex demo

备选方案:拆分字符串,使用 Array.filter 和相对简单的 RegExp 进行测试。

const valid = `TCP/53,UDP/53,TCP/10-20,UDP/20-30`;
const invalid = `TCP/53UDP53,TCP/10-20UDP20-30`;

console.log(`${valid} ok? ${checkInp(valid)}`);
console.log(`${invalid} ok? ${checkInp(invalid)}`);

function checkInp(str) {
  return str.split(`,`)
    .filter(v => /^(TCP|UDP)\/\d+(?:-\d+)*$/.test(v))
    .join(`,`)
    .length === str.length;
}