所以我有一个正则表达式模式,我想生成该模式允许的所有文本排列。
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(使用前将#替换为@)