用于网络服务端口定义的正则表达式
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 个逗号,请将 *
更改为 +
)
$
字符串结束
备选方案:拆分字符串,使用 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;
}
我的同事和我尝试构建一个正则表达式 (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 个逗号,请将*
更改为+
)$
字符串结束
备选方案:拆分字符串,使用 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;
}