代码之家  ›  专栏  ›  技术社区  ›  Joe

正则表达式生成器/减缩器?

  •  17
  • Joe  · 技术社区  · 14 年前

    一位同事向我提出了一个有趣的问题,关于我们目前的操作难点,我很好奇是否有什么东西(实用程序/库/算法)可以帮助实现自动化。

    所以,如果我的清单是:

    http://www.example.com
    http://www.example.com/subdir
    http://foo.example.com
    

    ^(http://www.example.com|http://www.example.com/subdir|http://foo.example.com)$
    

    目前,我们手动编写正则表达式,但这并不能很好地扩展,也不能很好地利用任何人的时间。有没有一种更自动化的方法来分解源数据,从而得到一个匹配所有源值的长度最优正则表达式?

    8 回复  |  直到 7 年前
        1
  •  16
  •   Rafał Dowgird    14 年前

    这个 Aho-Corasick 匹配算法构造一个有限自动机来匹配多个字符串。您可以将自动机转换为等效的regex,但是直接使用自动机更简单(这就是算法所做的)

        2
  •  8
  •   ESL    12 年前

    kemio.com.ar/tools/lst-trie-re.php

    您在右侧放置一个列表,提交它,然后在左侧获取regexp。

    var re=new RegExp(/..../,"mib");

        3
  •  3
  •   zwol    13 年前

    regexp-opt ( source code )它并不能完全满足您的需要(它只适用于固定字符串),但它可能是一个有用的起点。

        4
  •  2
  •   Mau    14 年前

    trie ,或 compressed trie ,甚至更好 directed acyclic word graph

    不过,您必须放弃regexp。

        5
  •  1
  •   Carl Smotricz    14 年前

    我认为退一步想想你在做什么,以及为什么这样做是有意义的。

    如果您确实需要regexp,那么您试图适应的变量差异是什么?也就是说,输入的哪一部分必须逐字匹配,哪里有回旋余地?

    如果您真的想使用regexp来匹配一个固定的字符串列表,也许是出于性能原因,那么编写一个将所有输入字符串粘在一起的方法应该足够简单,就像您的示例中那样。在后台进行regexp匹配的状态机非常聪明,如果您的匹配备选方案具有公共(因此可能是冗余的)子字符串,则不会运行得更慢。

        6
  •  1
  •   MAK    14 年前

    从另外两个答案中得到提示,您只需要匹配所提供的字符串,您最好直接进行字符串匹配(慢)或构造一个简单的FSM来匹配这些字符串(快)。

    regex实际上创建了一个FSM,然后将您的输入与之匹配,因此如果输入来自一组以前已知的集合,那么您可以自己创建FSM,而不是尝试自动生成regex,这通常更容易。

    Trie 然后查询它(因为您匹配的是整个字符串,而不是子字符串)?

        7
  •  0
  •   serv-inc    7 年前

    一种简单的方法是使用Python的 hachoir_regex 模块:

    urls = ['http://www.example.com','http://www.example.com/subdir','http://foo.example.com']
    as_regex = [hachoir_regex.parse(url) for url in urls]
    reduce(lambda x, y: x | y, as_regex)
    

    创建简化正则表达式

    http://(www.example.com(|/subdir)|foo.example.com)
    

    代码首先为每个URL创建一个简单的regex类型,然后用 |