如何更改正则表达式,使其在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.当我使用此正则表达式时,出现以下错误:

错误消息:正则表达式无效 "/^((?:(?: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" 在偏移量 5 附近。

知道如何重写它或在哪里修复它吗?

备注:生成了以下正则表达式,但未验证输入:

/^((25[0-5]|2[0-4]d|[01]?dd?).(25[0-5]|2[0-4]d|[01]?dd?).(25[0-5]|2[0-4]d|[01]?dd?).(25[0-5]|2[0-4]d|[01]?dd?)(|?))*$/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

编辑:一般来说,我尝试检查空格(我需要"没有空格"(。我尝试进行良好的检查,以确保列表中的IP也是有效的。显然,它太复杂了,无法从 T-SQL 创建。所以可能只是为了检查空白?

尝试删除字符串开始/^和字符串结束*$标签,以及/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 中(的一种方法可能是拆分输入并验证它老派

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 之间,是否有空格(DATALENGTHvs.LEN(等等...

希望这有帮助

相关内容

  • 没有找到相关文章

最新更新