正则表达式将 IP 与 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 文件)中,但似乎包含一些非法内容。不能制定出它是什么,已经看过这个,这个,这个和使用的建议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 中运行?


炎炎设计
浏览 182回答 2
2回答

RISEBY

对于 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]))?$(删除我为可读性添加的换行符。)Demo here。只有前 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]))?$
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python