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

时间:2014-10-30 09:40:30

标签: c# xml regex xsd

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

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

给了我C#字符串

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

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

在这个简单的例子中,它显然是8 - 我可以通过检查{n}并假设它的长度来解决这个问题。在其他模式中,我也可以检查*或+并假设无限制 - 但我正在寻找可用于执行此操作的更通用的方法。

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

我也可以访问XmlSchemaPatternFacet类,这是我用来解析XSD的首要任务,如果有任何帮助的话。

感谢您提供任何帮助

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

有了这些定义:

<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正则表达式相比, the XML schema regular expressions功能受限。因为它们仅用于验证整个元素是否与模式匹配。 Afaik,只允许greedy quantifiers ?, *, +{n,m}

答案 2 :(得分:0)

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

编辑:我发现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);

此外,我不确定它是否找到了最大可能的答案,但它可以是一个开始。