1

我和我的同事尝试构建一个正则表达式(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

感谢您的任何指导!

4

2 回答 2

2

您不需要所有这些交替,并且[ ]不用于这样的分组。您还可以-使用分组将和数字部分设为可选(?:...)?

要匹配该字符串格式:

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

模式匹配:

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

正则表达式演示

于 2022-01-13T11:42:35.387 回答
0

替代方案:拆分字符串,使用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;
}

于 2022-01-13T12:08:52.670 回答