即,我得到一个单词列表,我想构建一个简单的正则表达式,至少匹配所有单词(但可能更多)。
我想要一个算法。即该算法的输入是单词列表,输出是正则表达式。显然,会有一些限制。就像正则表达式总是匹配更多的单词,如果它应该匹配无限量的单词,我只给它有限数量的单词。或者我需要一些更紧凑的输入表示。或者我也在考虑给我一些正则表达式作为输入和一个附加单词列表,我想得到一个正则表达式,将所有这些表达式匹配在一起(也许更多)。无论如何,它应该尝试构造一个尽可能简单的正则表达式。
哪些技术可以做到?
我被误解了。我知道正则表达式背后的一般原则。我知道它是什么。在大多数情况下,我可以很容易地用手工正式表达某种语言。但我正在寻找能够做到这一点的算法。
再次制定了一点点不同:
让L成为常规语言。设M_n是具有n个元素的L的有限子集。设M_n为M_(n + 1)的子集。
我希望有一个算法LRE,它可以获得一组有限的单词并输出正则表达式。我想拥有这个属性:
lim_n-> infinity | diff(LRE(M_n),L)| = 0
答案 0 :(得分:2)
请参阅此网站以了解一般原则:http://www.regular-expressions.info/
如果你拥有的是dog, cat, cow, mouse
之类的单词列表,那么最简单的正则表达式可以匹配其中任何一个:dog|cat|cow|mouse
,但请注意它也会匹配doggone
,scatological
等...它可能与DOGGONE
,COWPATTY
等匹配,也可能不匹配...取决于您是否区分大小写匹配。如果给出关于你的问题的更多细节,可以给出更好的模式。
获得正则表达式测试工具也是一个好主意。我喜欢Expresso,它适用于.NET模式。由于正则表达式的功能可能因平台而异,因此请确保您的工具支持您的平台。
答案 1 :(得分:1)
过去十年来一直关注这个问题。您可能想要谷歌DFA学习,并下载几篇论文,以了解最新技术。
一旦你有DFA生成一个正则表达式是微不足道的。为了避免问题,@ FrustratedWithDesign提到了一些条件,例如生成节点数量最少的DFA,从机器学习的角度来看,这类似于最简单假设的正则化条件。
答案 2 :(得分:0)
答案 3 :(得分:0)
如果你有一个你想要匹配的不同单词的列表 - 听起来并不像你在正则表达式最适合的东西上匹配。
正如FrustratedWithFormsDesigner指出的那样 - 在最坏的情况下,你的正则表达式将被映射到列表中的项目;最好的情况下,你可以找到共同的前缀。如果你自动化正则表达式构造,为什么要打扰正则表达式呢?用例是什么?
但如果你的名单超出了一个微不足道的规模,那么你可能最好不要再循环使用它。
答案 4 :(得分:0)
http://www.regular-expressions.info是Regex Reference的绝佳网站。
在构建复杂的正则表达式时,我通常使用Expresso。这是一个免费的应用程序,可以帮助您构建正则表达式。它将它们分解为树形视图,以便很容易看到所有部件正在做什么。 http://www.ultrapico.com/Expresso.htm它可以与.NET语言一起使用,但是有很多这样的工具可用于不同的语言。
要构建我的Regex,我通常会以可接受的值开头,并开始用Regex语法替换字符。
例如,如果我尝试匹配一个URL,我将从
开始http://www.mydomain.com
然后我会逃避任何需要逃避的事情
http://www\.mydomain\.com
然后我会开始替换字符
http://www\.\w+\.\w+\.\w+
显然这个表达需要更多的工作,但你明白了
答案 5 :(得分:0)
以下是Perl正则表达式的网站:
http://perldoc.perl.org/perlre.html