如何更改 RegEx 使其在 SQL 服务器中工作?
How to change RegEx so it works in SQL Server?
我有以下正则表达式:
/^((?:(?: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]?)(\|?))*$/g
我需要它来验证输入(由管道分隔的 IP 地址列表 (IP v.4))使用 XSD
,例如:
192.168.10.11|192.168.10.10
我使用 T-SQL
生成 XSD
。当我使用此 RegEx 时出现以下错误:
Error Message: Invalid regular expression
"/^((?:(?: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]?)(\|?))*$/g"
near the offset 5.
知道如何重写它或在哪里修复它吗?
备注:已生成以下 RegEx 但未验证输入:
/^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)(\|?))*$/g
T-SQL 生成:
CREATE XML SCHEMA COLLECTION schFile0000001234 AS
'<xsd:schema
targetNamespace="http://example.com/brg/"
elementFormDefault="qualified"
xmlns="http://example.com/brg/"
xmlns:mstns="http:/example.com/brg/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
version="1.0.1"
>
<xsd:complexType name="ct0000006847_KDK_XXX_Front_Parameters">
<xsd:sequence>
<xsd:element name="KDK_XXX_Front_AllowedSourceIPs" minOccurs="1" maxOccurs="1">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:minLength value="1"/>
<xsd:maxLength value="1000"/>
<xsd:pattern value="/^((?:(?: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]?)(\|?))*$/g"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>';
GO
编辑: 通常我会尝试检查白色 space(我需要 "No white space")。我尝试仔细检查以确保列表中的 IP 也有效。显然,从 T-SQL 创建它太复杂了。所以可能只是为了检查白色 space?
尝试删除字符串开始 /^
和字符串结束 *$
标记,以及 /g
选项。换句话说,尝试以下模式:
<xs:pattern value="(((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]?)(\|?))*"/>
但是,上面的正则表达式接受额外的尾随 |
。为避免这种情况,您可以使用以下模式:
<xs:pattern value="((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]?)(\|((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]?))*"/>
我建议使用 [0-9]
而不是 \d
,以避免匹配其他语言的数字,例如 ৩
(但您已经编辑了问题以避免这种情况)。
使用纯 T-SQL(但不在 XSD 内)的一种方法可能是拆分您的输入并验证它 old school:
DECLARE @tbl TABLE(ID INT IDENTITY, YourIPList VARCHAR(500));
INSERT INTO @tbl VALUES('192.168.10.11|192.168.10.10');
WITH SplittedAtPipe AS
(
SELECT ID
,ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS IP_index
,YourIPList
,[ip].value('text()[1]','varchar(100)') AS OneIp
FROM @tbl
CROSS APPLY(SELECT CAST('<x>' + REPLACE(YourIPList,'|','</x><x>') + '</x>' AS XML) AS IPXml) A
CROSS APPLY A.IPXml.nodes('/x') B([ip])
)
,SplittedAtDot AS
(
SELECT SplittedAtPipe.*
,ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Frg_index
,frg.value('text()[1]','varchar(100)') AS IPFragment
FROM SplittedAtPipe
CROSS APPLY(SELECT CAST('<x>' + REPLACE(OneIp,'.','</x><x>') + '</x>' AS XML) AS IPFragment) A
CROSS APPLY A.IPFragment.nodes('/x') B(frg)
)
SELECT *
FROM SplittedAtDot;
您可以检查每个片段是否为数字 (TRY_CAST
),INT
是否在 0 到 255 之间,是否有空格 (DATALENGTH
vs. LEN
) 等等...
希望对您有所帮助
我有以下正则表达式:
/^((?:(?: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]?)(\|?))*$/g
我需要它来验证输入(由管道分隔的 IP 地址列表 (IP v.4))使用 XSD
,例如:
192.168.10.11|192.168.10.10
我使用 T-SQL
生成 XSD
。当我使用此 RegEx 时出现以下错误:
Error Message: Invalid regular expression "/^((?:(?: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]?)(\|?))*$/g" near the offset 5.
知道如何重写它或在哪里修复它吗?
备注:已生成以下 RegEx 但未验证输入:
/^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)(\|?))*$/g
T-SQL 生成:
CREATE XML SCHEMA COLLECTION schFile0000001234 AS
'<xsd:schema
targetNamespace="http://example.com/brg/"
elementFormDefault="qualified"
xmlns="http://example.com/brg/"
xmlns:mstns="http:/example.com/brg/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
version="1.0.1"
>
<xsd:complexType name="ct0000006847_KDK_XXX_Front_Parameters">
<xsd:sequence>
<xsd:element name="KDK_XXX_Front_AllowedSourceIPs" minOccurs="1" maxOccurs="1">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:minLength value="1"/>
<xsd:maxLength value="1000"/>
<xsd:pattern value="/^((?:(?: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]?)(\|?))*$/g"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>';
GO
编辑: 通常我会尝试检查白色 space(我需要 "No white space")。我尝试仔细检查以确保列表中的 IP 也有效。显然,从 T-SQL 创建它太复杂了。所以可能只是为了检查白色 space?
尝试删除字符串开始 /^
和字符串结束 *$
标记,以及 /g
选项。换句话说,尝试以下模式:
<xs:pattern value="(((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]?)(\|?))*"/>
但是,上面的正则表达式接受额外的尾随 |
。为避免这种情况,您可以使用以下模式:
<xs:pattern value="((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]?)(\|((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]?))*"/>
我建议使用 [0-9]
而不是 \d
,以避免匹配其他语言的数字,例如 ৩
(但您已经编辑了问题以避免这种情况)。
使用纯 T-SQL(但不在 XSD 内)的一种方法可能是拆分您的输入并验证它 old school:
DECLARE @tbl TABLE(ID INT IDENTITY, YourIPList VARCHAR(500));
INSERT INTO @tbl VALUES('192.168.10.11|192.168.10.10');
WITH SplittedAtPipe AS
(
SELECT ID
,ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS IP_index
,YourIPList
,[ip].value('text()[1]','varchar(100)') AS OneIp
FROM @tbl
CROSS APPLY(SELECT CAST('<x>' + REPLACE(YourIPList,'|','</x><x>') + '</x>' AS XML) AS IPXml) A
CROSS APPLY A.IPXml.nodes('/x') B([ip])
)
,SplittedAtDot AS
(
SELECT SplittedAtPipe.*
,ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Frg_index
,frg.value('text()[1]','varchar(100)') AS IPFragment
FROM SplittedAtPipe
CROSS APPLY(SELECT CAST('<x>' + REPLACE(OneIp,'.','</x><x>') + '</x>' AS XML) AS IPFragment) A
CROSS APPLY A.IPFragment.nodes('/x') B(frg)
)
SELECT *
FROM SplittedAtDot;
您可以检查每个片段是否为数字 (TRY_CAST
),INT
是否在 0 到 255 之间,是否有空格 (DATALENGTH
vs. LEN
) 等等...
希望对您有所帮助