[英]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文件)中,但似乎包含非法內容。 無法弄清楚它是什么,已經看過this , this , this ,並嘗試使用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.