计算与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); 

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