簡體   English   中英

正則表達式將IP與jsonschema中的掩碼匹配

[英]regex to match IP with mask in a jsonschema

這里有一個很好的解決方案可將IP與掩碼匹配,例如192.168.0.1/24 我添加了來自https://regex101.com/的建議以逃避斜線,它看起來像這樣:

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

這肯定在regex101上起作用。

它需要存在一個json文件(jsonschema文件)中,但似乎包含非法內容。 無法弄清楚它是什么,已經看過thisthisthis ,並嘗試使用ujson代替此處建議的json(在python中),但沒有任何效果。

以下包含該正則表達式的jsonschema:

{
    "comment": "ipv4 with a mask",
    "data": {
        "network": {
        }
    },
    "schema": {
        "$schema": "http://json-schema.org/draft-04/schema#",
        "title": "ipv4 with a mask",
        "type": "object",
        "properties": {
            "subnet": {
                "title": "subnet",
                "type": "string",
                "pattern": "((^|\.)((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]?\d))){4}\/(?:\d|[12]\d|3[01])$"
            }
        }
    }
}

...不幸的是甚至無法解析。 Python在說:

JSONDecodeError: Invalid \escape: line 16 column 33 (char 380)

我一直在使用庫fastjsonschema來檢查這些內容,但是甚至無法解析json並達到目標。

有誰知道如何解決此問題,以某種方式使該正則表達式在jsonschema中起作用?

對於JSON,您需要使用另一個反斜杠對每個反斜杠\\進行轉義:

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

因此,在JSON模式中,它看起來像:

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

無論如何,您在鏈接中找到的正則表達式與數字分組不太匹配。 用一些示例進行嘗試- 完全匹配是正確的,但是返回的包括帶數字的點或僅包含點。

如果您想要IP地址的所有部分,而不僅僅是一個完整的匹配,那么這里是基於此的正則表達式。 我包括了一個可選子網掩碼的匹配項:

^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
(?:\/(\d|[12]\d|3[01]))?$

(刪除為方便閱讀而添加的換行符。) 此處演示 只有前3個地址應該匹配,其余的不應該匹配。

如果只需要完整匹配,而不是單個部分,請使用以下命令:

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

您不會相信,但是2個反斜杠是不夠的!

它不能與2個反斜杠一起使用,它需要3或4個,所以將與3個反斜杠一起使用

不得不花幾個小時來實現這一點,但是從@TimPietzcker找到了這個答案 ,它說:

您需要對正則表達式使用轉義反斜杠,然后再次對字符串處理器進行轉義。

因此, 工作代碼如下所示(略微調整了原始架構):

import json    
import fastjsonschema

schema = '''{
    "data": [{"subnet": "192.168.1.1/24"}],
        "$schema": "http://json-schema.org/draft-04/schema#",
        "type": "array",
        "items": {
            "type": "object",
            "properties": {
                "subnet": {
                    "title": "subnet",
                    "type": "string",
                    "pattern": "((^|\\\.)((25[0-5])|(2[0-4]\\\d)|(1\\\d\\\d)|([1-9]?\\\d))){4}\\\/(?:\\\d|[12]\\\d|3[01])$"
                }
            }
        }
    }''' 

schema = json.loads(schema)
validate = fastjsonschema.compile(schema)

def check_subnets(testcase):
    try: 
        validate([{"subnet": testcase}])
        print("yes a subnet")
    except fastjsonschema.JsonSchemaException:
        print("not a subnet")    

然后進行一些測試:

>>> check_subnets("192.168.0.1/24") 
yes a subnet
>>> check_subnets("192.168.0.1/50")
not a subnet
>>> check_subnets("192.168.0.1")
not a subnet
>>> check_subnets("192.168.0.900/24")
not a subnet

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM