计算与xsd(C#)中的正则表达式匹配的字符串的最大可能长度
我正在使用XSD,我可以从XSD访问模式作为字符串。 一个例子:
给了我C#字符串
string pattern = "[0-9]{8}";
从我从XSD(可能是任何有效的XSD模式条目)获得的模式字符串,我试图找出XML中字段的内容可能的最大可能长度。
在这个简单的例子中,它显然是8 – 我可以通过检查{n}并假设它是长度来解决这个问题。 在其他模式中,我也可以检查*或+并假设无限制 – 但我正在寻找可用于执行此操作的更通用的方法。
请注意,模式字符串不保证与.Net的Regex类兼容。
我也可以访问XmlSchemaPatternFacet类,这是我用来解析XSD的第一个地方,如果有任何帮助的话。
谢谢你提供的所有帮助
你几乎肯定需要解析正则表达式来实现这一点。 例如,你可以在Saxon中使用开源正则表达式解析器(它实现了正确的正则表达式方言)。 这将创建一个子表达式树,您可以添加一个方法来计算树中每个节点的最大匹配长度。 表示树中节点的Operation
类已经(在9.6中)具有getMatchLength()
和getMinimumMatchLength()
,并且添加一个以相同方式工作的getMaximumMatchLength()
也很容易。
有了这些定义:
所有这些都将validation:
12345678 12345 12345678
这些不会:
12345 123456789
即使我猜你正在寻找:
所有这些匹配:
12345678900000000 88 0
与其他.Net正则表达式相比, XML模式正则表达式在function上受到限制 。 因为它们仅用于validation整个元素是否与模式匹配。 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);
此外,我不确定它找到最大可能的答案,但它可以是一个开始。