从 C# 中的正则表达式模式生成文本的所有排列

2024-01-09

所以我有一个正则表达式模式,我想生成该模式允许的所有文本排列。

Example:

var pattern = "^My (?:biological|real)? Name is Steve$";
var permutations = getStringPermutations(pattern);

这将返回以下字符串列表:

我的名字是史蒂夫

我的真名是史蒂夫

我的名字是史蒂夫

Update:显然,正则表达式具有无限数量的匹配项,因此我只想生成可选字符串文字,如 (?:biological|real)?从我上面的例子来看。像 (.)* 这样的东西有太多匹配项,所以我不会从中生成它们。


如果您将自己限制为锚定在两端的正则表达式子集,并且仅涉及文字文本、单字符通配符和交替,则匹配 字符串应该很容易枚举。我可能会将正则表达式重写为 BNF 语法 并使用它来生成匹配字符串的详尽列表。对于你的例子:

<lang>   -> <begin> <middle> <end>
<begin>  -> "My "
<middle> -> "" | "real" | "biological"
<end>    -> " name is Steve"

从 RHS 上只有终结符号的产生式开始,并枚举 LHS 上的非终结符可以采用的所有可能值。然后工作你的 一直到 RHS 上带有非终结符的产生式。对于非终结符的串联,形成由每个 RHS 非终结符表示的集合的笛卡尔积。 对于交替,取每个选项所代表的集合的并集。继续 直到你努力达到<lang>,然后你就完成了。

但是,一旦包含“*”或“+”运算符,您就必须应对无限的情况 匹配字符串的数量。如果您还想处理诸如反向引用之类的高级功能……您可能已经在实现同构的路上了 停止问题!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 C# 中的正则表达式模式生成文本的所有排列 的相关文章

随机推荐