计算xsd(C#)中与正则表达式匹配的字符串的最大可能长度

本文关键字:字符串 xsd 正则表达式 计算 | 更新日期: 2023-09-27 18:28:28

我正在使用XSD,并且我可以作为字符串访问XSD中的模式。一个例子:

<xsd:pattern value="[0-9]{8}"/>

给我C#字符串

string pattern = "[0-9]{8}";

根据我从XSD中获得的模式字符串(可以是任何有效的XSD模式条目),我试图计算出XML中字段内容的最大可能长度

在这个琐碎的例子中,它显然是8——我可以通过检查{n}并假设这是长度来计算出来。在其他模式中,我也可以检查*或+并假设无界,但我正在寻找一种更通用的方法来实现这一点。

请注意,模式字符串不能保证与.Net的Regex类兼容。

我还可以访问XmlSchemaPatternFacet类,如果有帮助的话,我首先使用它来解析XSD。

感谢您为提供的任何帮助

计算xsd(C#)中与正则表达式匹配的字符串的最大可能长度

您几乎肯定需要解析正则表达式才能实现这一点。例如,您可以使用Saxon中的开源正则表达式解析器(它实现了正确的regex方言)。这将创建一个子表达式树,您可以添加一个方法来计算树中每个节点的最大匹配长度。代表树中一个节点的Operation类(在9.6中)已经有了方法getMatchLength()getMinimumMatchLength(),添加一个以相同方式工作的getMaximumMatchLength()就足够容易了。

使用这些定义:

<xs:simpleType name="ST_exactly8digitsString">
    <xs:restriction base="xs:string">
        <xs:pattern value="[0-9]{8}"/>
    </xs:restriction>
</xs:simpleType>
<xs:simpleType name="ST_upto8digitsString">
    <xs:restriction base="xs:string">
        <xs:pattern value="[0-9]{0,8}"/>
    </xs:restriction>
</xs:simpleType>

所有这些都将验证:

<upto8digitsString>12345678</upto8digitsString>
<upto8digitsString>12345</upto8digitsString>
<exactly8digitsString>12345678</exactly8digitsString>

这些不会:

<exactly8digitsString>12345</exactly8digitsString>
<upto8digitsString>123456789</upto8digitsString>

尽管我猜你正在寻找:

<xs:simpleType name="ST_anyNoDigitsString">
    <xs:restriction base="xs:string">
        <xs:pattern value="[0-9]*"/>
    </xs:restriction>
</xs:simpleType>

所有这些都匹配:

<anyNoDigitsString>12345678900000000</anyNoDigitsString>
<anyNoDigitsString>88</anyNoDigitsString>
<anyNoDigitsString></anyNoDigitsString>
<anyNoDigitsString>0</anyNoDigitsString>

与其他.Net正则表达式相比,XML模式正则表达式的功能有限。因为它们只用于验证整个元素是否与模式匹配。Afaik,只允许贪婪量词?, *, +{n,m}

我的猜测是这将非常困难。使用嵌入式大括号,您将不得不反复搜索模式长度。

编辑:我找到了https://github.com/moodmosaic/Fare这似乎符合你的要求。

var regex = @"((mailto':|(news|(ht|f)tp(s?))'://){1}'S+)";
var xeger = new Xeger(regex);
var result = Regex.IsMatch(xeger.Generate(), regex);

我也不确定它是否能找到最大可能的答案,但这可能是一个开始。