我正在使用XSD,我可以从XSD访问模式作为字符串。一个例子:
<xsd:pattern value="[0-9]{8}"/>
给了我C#字符串
string pattern = "[0-9]{8}";
从我从XSD获得的模式字符串(可以是任何有效的XSD模式条目),我试图找出XML中字段内容的最大可能长度。
在这个简单的例子中,它显然是8 - 我可以通过检查{n}并假设它的长度来解决这个问题。在其他模式中,我也可以检查*或+并假设无限制 - 但我正在寻找可用于执行此操作的更通用的方法。
请注意,模式字符串不保证与.Net的Regex类兼容。
我也可以访问XmlSchemaPatternFacet类,这是我用来解析XSD的首要任务,如果有任何帮助的话。
感谢您提供任何帮助
答案 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);
此外,我不确定它是否找到了最大可能的答案,但它可以是一个开始。