-1

即,我得到一个单词列表,我想从匹配至少所有单词(但可能更多)的单词中构造一个简单的正则表达式。

我想有一个算法。即该算法的输入是单词列表,输出是正则表达式。显然,会有一些限制。就像正则表达式应该匹配无限数量的单词时总是匹配更多的单词,而我只给它有限数量的单词。或者我需要一些更紧凑的输入表示。或者我也在考虑给我一些正则表达式作为输入和一个额外的单词列表,我想得到一个正则表达式,它将所有它们匹配在一起(也许更多)。无论如何,它应该尝试构造一个尽可能简单的正则表达式。

有哪些技术可以做到这一点?


我被误解了。我知道正则表达式背后的一般原则。我知道它是什么。在大多数情况下,我可以很容易地手动为某种语言提供正则表达式。但我正在寻找能够做到这一点的算法。


再次表述有点不同:

令 L 为常规语言。令 M_n 是具有 n 个元素的 L 的有限子集。令 M_n 是 M_(n+1) 的子集。

我想要一个算法 LRE,它可以获取一组有限的单词并输出一个正则表达式。我想拥有财产:

lim_n->无穷大 ​​| 差异(LRE(M_n),L)| = 0

4

6 回答 6

2

请参阅此网站以了解一般原则:http ://www.regular-expressions.info/

如果您只有一个单词列表,例如dog, cat, cow, mouse,匹配其中任何一个的最简单dog|cat|cow|mouse的正则表达式是: ,但请注意,它也将匹配doggone,scatological等...它可能匹配也可能不匹配DOGGONE,COWPATTY等...取决于关于您是否正在进行区分大小写的匹配。如果给出关于您的问题的更多细节,则可以给出更好的模式。

获得一个正则表达式测试工具也是一个好主意。我喜欢 Expresso,它适用于 .NET 模式。由于正则表达式功能可能因平台而异,因此请确保您的工具支持您的平台。

于 2010-12-10T16:45:18.173 回答
1

这个问题在过去十年中一直在研究。您可能想在谷歌上搜索 DFA 学习,并下载几篇论文以了解最新技术。

一旦你让 DFA 生成正则表达式是微不足道的。为了避免这些问题,@FrustratedWithDesign 提到了一些条件,例如引入了具有最少节点的 DFA,从机器学习的角度来看,这类似于为最简单的假设提供正则化条件。

于 2010-12-21T17:06:58.843 回答
0

使用此站点学习基础知识并使用rubular进行实时测试。

于 2010-12-10T16:46:13.453 回答
0

如果您有一个要匹配的不同单词的列表——听起来您不是在匹配正则表达式最擅长的东西。

正如FrustratedWithFormsDesigner指出的那样——在最坏的情况下,您的正则表达式将被映射到列表中的项目;最好的情况是你可以找到常见的前缀。如果你自动化了正则表达式的构建,为什么还要麻烦正则表达式呢?用例是什么?

但是,如果您的列表超出了微不足道的大小,那么您最好循环遍历它。

于 2010-12-10T16:50:52.550 回答
0

http://www.regular-expressions.info是一个很棒的正则表达式参考网站。

在构建复杂的正则表达式时,我通常使用 Expresso。这是一个免费的应用程序,可以帮助您构建正则表达式。它将它们分解为树视图,以便轻松查看所有部分在做什么。 http://www.ultrapico.com/Expresso.htm 它适用于 .NET 语言,但有很多类似的工具可用于不同的语言。

为了构建我的正则表达式,我通常会从一个可接受的值开始,然后开始用正则表达式语法替换字符。

例如,如果我试图匹配一个 URL,我会从

http://www.mydomain.com

然后我会逃避任何需要逃避的东西

http://www\.mydomain\.com

然后我会开始替换字符

http://www\.\w+\.\w+\.\w+

显然这个表达式需要更多的工作,但你明白了

于 2010-12-10T17:51:33.947 回答
0

这是 Perl 正则表达式的站点:

http://perldoc.perl.org/perlre.html
于 2010-12-10T18:50:10.033 回答