【问题标题】:Regex separate ports by comma正则表达式用逗号分隔端口
【发布时间】:2016-04-05 19:53:08
【问题描述】:

问题

我有一个有效的端口有效性检查器,但是我需要用逗号分隔端口(没有空格)。例如,不仅仅是“80”有效,现在“80,443,8080”也有效。

正则表达式

(^(?:6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])$

试过

我意识到我可能需要分解查询,所以尝试了很多方法,包括将这个 (,\n|,?$) 附加到查询的末尾,但是这不起作用。

【问题讨论】:

  • 如果一个正则表达式变得那么长,最好将其重构为其他字符串操作和更清晰的正则表达式。

标签: php regex validation


【解决方案1】:

由于它是 PHP,具有 PCRE 正则表达式风格,您可以使用子例程轻松递归子模式:

^(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])(?:,(?1))*$

regex demo

解释

  • ^ - 字符串开头
  • (6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9]) - 第 1 组:单端口验证子模式
  • (?:,(?1))* - 0+ 个, 序列,后跟上面的子模式((?1) 子例程在组 1 内重复使用模式)
  • $ - 字符串结束

【讨论】:

  • 我已经修改了正则表达式演示以允许同时使用破折号和逗号分隔端口,因此您必须验证端口的格式是 80-81 还是 80,81,82 @987654322 @
【解决方案2】:

否则,您可以否定您正在寻找的内容。这意味着:

  • 65535 以上的 5 位数字,或至少 6 位数字
  • 连续的逗号,或逗号在字符串的结尾或开头
  • 不是数字或逗号的字符

要使用这种模式,你显然需要否定preg_match函数:

return !preg_match('~6(?:5(?:5(?:3(?:[6-9]|\d{2})|[4-9]\d)|[6-9]\d{2})|[6-9]\d{3})|[7-9]\d{4}|[1-9]\d{5}|\B,|,\B|[^\d,]~S', $str);

S 修饰符开启非锚定模式的优化。

这种方法可能很有趣,因为一旦模式成功,搜索就会停止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多