我认为标题准确地总结了我的问题,但只是详细说明。
我不想使用正则表达式来验证现有字符串的属性,而是使用正则表达式作为生成具有某些属性的字符串的方法。
注意:该函数不需要生成满足正则表达式的每个字符串(因为对于许多正则表达式而言,这将是无限数量的字符串) 。只需抽取许多有效字符串即可。
这样的可行性如何?如果解决方案太复杂/太大,我对一般性讨论/大纲感到满意。此外,我对任何现有的程序或库(.NET)感兴趣。
答案 0 :(得分:10)
正则表达式可转换为DFA,可以将其视为图形。要根据此DFA图生成字符串,您只需找到从开始状态到结束状态的路径。你只需要考虑如何处理循环(也许至少遍历每个循环一次以获得一次采样?n次?),但我不明白为什么它不起作用。
答案 1 :(得分:2)
这可以通过traversing the DFA(包括伪代码)完成,也可以直接遍历正则表达式的抽象语法树或首先转换为NFA,如Doug McIlroy所述:paper和{ {3}}。 (他发现NFA的方法更快,但他没有将它与DFA进行比较。)
这些都适用于没有反向引用的正则表达式 - 即“真正的”正则表达式而不是Perl正则表达式。要处理额外的Perl功能,最简单的方法是在后置过滤器上添加。
在Python中添加了 Haskell code,Peter Norvig和我。
答案 2 :(得分:2)
这utility on UtilityMill会反转一些简单的regexen。它基于this example from the pyparsing wiki。该计划的测试用例是:
[A-EA]
[A-D]*
[A-D]{3}
X[A-C]{3}Y
X[A-C]{3}\(
X\d
foobar\d\d
foobar{2}
foobar{2,9}
fooba[rz]{2}
(foobar){2}
([01]\d)|(2[0-5])
([01]\d\d)|(2[0-4]\d)|(25[0-5])
[A-C]{1,2}
[A-C]{0,3}
[A-C]\s[A-C]\s[A-C]
[A-C]\s?[A-C][A-C]
[A-C]\s([A-C][A-C])
[A-C]\s([A-C][A-C])?
[A-C]{2}\d{2}
@|TH[12]
@(@|TH[12])?
@(@|TH[12]|AL[12]|SP[123]|TB(1[0-9]?|20?|[3-9]))?
@(@|TH[12]|AL[12]|SP[123]|TB(1[0-9]?|20?|[3-9])|OH(1[0-9]?|2[0-9]?|30?|[4-9]))?
(([ECMP]|HA|AK)[SD]|HS)T
[A-CV]{2}
A[cglmrstu]|B[aehikr]?|C[adeflmorsu]?|D[bsy]|E[rsu]|F[emr]?|G[ade]|H[efgos]?|I[nr]?|Kr?|L[airu]|M[dgnot]|N[abdeiop]?|Os?|P[abdmortu]?|R[abefghnu]|S[bcegimnr]?|T[abcehilm]|Uu[bhopqst]|U|V|W|Xe|Yb?|Z[nr]
(a|b)|(x|y)
(a|b) (x|y)
答案 3 :(得分:1)
由于编写一个不匹配任何可能的字符串的正则表达式是非常简单的,并且我相信也可以编写一个正则表达式,计算匹配字符串需要穷举搜索所有长度的可能字符串,你' ll可能需要一个上限来请求答案。
答案 4 :(得分:0)
最简单的实现方法,但绝对是大多数CPU时间密集型方法,只是简单地强制它。 设置一个包含字符串应包含的字符的字符表,然后依次生成字符串并对它们执行Regex.IsMatch。
答案 5 :(得分:0)
我个人认为,这是reg-ex的圣杯。如果你能够实现这一点 - 即使只有3/4工作 - 我毫不怀疑你在大约5分钟内变得富有。
所有开玩笑,我不确定你真正想要的是可行的。 Reg-Ex是一种非常开放,灵活的语言,它为计算机提供了足够的样本输入,以便真正准确地找到您需要的内容,这可能是不可行的。
如果我被证明是错的,我希望得到开发者的赞誉。
从不同的角度来看,这几乎(不完全)就像给计算机输出一样,并且基于此 - 拥有它 - 为你编写一个程序。这有点过分,但它有点说明了我的观点。