IP&端口正则表达式

1.输入多个IP用逗号隔开验证函数

//多个ip以','隔开,输入验证函数,例:172.21.33.7,172.21.33.9-254
export default function validIp(value) {
  const ipv4s = value.split(',')
  for (let item of ipv4s) {
    if (item.includes('-')) {
      let arr = item.split('-')
      if (arr.length > 2) {
        return false
      }
      let [front, after] = arr
      let end = front.split('.')[3]
      if (!/(^[1-9]\d*$)/.test(after) || end - after >= 0 || after > 255) {
          return false
      }
    } else {
      let valid = checkIpv4(item)
      if (!valid) return false
    }
  }
  return true
}    
//格式化ip
/*
 * FilePath: \src\views\strategy\formatter-ip.js
 * Project: xxx
 * CreatedAt: 2021-03-01 17:39:41
 * CreatedBy: 666
 * Copyright: (c) 2021
 * Task: #1
 * 格式化ip函数
 */

import { split as _split, isEmpty } from 'lodash'

/**
 * ip数组格式化--输入&返回均为数组
 * 例:172.21.33.7,172.21.33.9-254
 * 输入:[172.21.33.7,172.21.33.9-254]  //数组中元素为字符串,在这里省略了""
 * 返回:[172.21.33.7,172.21.33.9-172.21.33.254]
 * @param {array} ipv4List
 */
//封装数据写入数据库调用
export function ipFormatterArray (ipv4List) {
  ipv4List.forEach((item, index) => {
    if (item.includes('-')) {   // 172.21.33.9-254
      const before = item.split('-')[0]   // 172.21.33.9
      let after = item.split('-')[1]   // 254
      const split = _split(before, '.', 3)  // [172,21,33]
      const splitStr = split.join('.')   // 172.21.33
      after = splitStr + '.' + after   // 172.21.33.254
      ipv4List[index] = before + '-' + after  // "172.21.33.9-172.21.33.254"
    }
  })
  return ipv4List  []
}

/**
 * ip数组格式化成字符串输出--输入数组、返回字符串
 * 例:"172.21.33.7,172.21.33.9-172.21.33.254"
 * 输入:[172.21.33.7,172.21.33.9-172.21.33.254]  //数组中元素为字符串,在这里省略了""
 * 返回:"172.21.33.7,172.21.33.9-254"
 * @param {array} ipv4List
 */
 //将数据库返回的数据写显示在页面上时调用
export function ipFormatterString (ipv4List) {
  if(!isEmpty(ipv4List)) {      
    ipv4List.forEach((item, index) => {
      if (item.includes('-')) {    // 172.21.33.9-172.21.33.254
        const before = item.split('-')[0]  // 172.21.33.9
        const after = item.split('-')[1]   // 172.21.33.254
        const end = after.split('.')[3] || after  // 254
        ipv4List[index] = before + '-' + end  // 172.21.33.9-254
      }
    })
    const ipv4Str = ipv4List.join(',')  // "172.21.33.7,172.21.33.9-254"
    return ipv4Str
  }
  return ''
}

//(1)封装数据写入数据库 "172.21.33.7,172.21.33.9-254"  => "172.21.33.7,172.21.33.9-172.21.33.254"
let sourceIpList = this.sourceIp.split(',')   //this.sourceIp=172.21.33.7,172.21.33.9-254
sourceIpList = ipFormatterArray(sourceIpList)
let data = {
  sourceIp: sourceIpList.join(','),  //sourceIp="172.21.33.7,172.21.33.9-172.21.33.254"
  destIp: destIpList.join(','),
  riskLevel: Number(riskLevel),
  remark
}

//(2)将数据库返回的数据显示在页面上 "172.21.33.7,172.21.33.9-172.21.33.254"  => "172.21.33.7,172.21.33.9-254"
const { sourceIp, destIp, riskLevel } = this.currentModel
let sourceIpList = sourceIp.split(',')
this.sourceIp = ipFormatterString(sourceIpList)

2.正则表达式验证IP和端口格式的正确性

(1)ip的正则表达式:

正则表达式 - 元字符(^ 、$ 、* 、\ 、+ 、? …)

格式是由“.”分割的四部分,每部分的范围是0-255;

每段的正则可以分几部分来写:200255100-19910-990-9;

每一部分对应的正则表达式:   2[0-4]\d|25[0-5];   1\d{2};      [1-9]\d;  \d

所以连起来就是:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]**

那么IP的正则就是(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])JS中表示为:/^(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$/
-----------------------------------------------------------------------------------------
注:IP地址格式可表示为:XXX.XXX.XXX.XXXXXX取值范围是0-255,前三段加一个.重复了三次,在与最后一段合并及组成IP地址的完整格式。
所以IP地址的正则表示法如下:

=========================================================================================
ipv4: /^((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))$/

其中: ? 表示:匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do""does"? 等价于 {0,1}========================================================================================
ipv6: /^([\da-fA-F]{1,4}:){7}[\da-fA-F]{1,4}$/

(2)端口的正则表达式:

格式是0-65535,。

同理可以分为几部分来构造:60000-6553510000-599991000-9999100-99910-990-9;

每部分的正则是:           6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5];       [1-5]\d{4};      [1-9]\d{3};     [1-9]\d{2};[1-9]\d; [0-9]

整理完就是:([0-9]|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])

JS中表示为:

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

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值