计算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。
感谢您为提供的任何帮助
您几乎肯定需要解析正则表达式才能实现这一点。例如,您可以使用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);
我也不确定它是否能找到最大可能的答案,但这可能是一个开始。