从一系列输入生成正则表达式

时间:2012-09-14 16:38:30

标签: regex

是否有可能从一系列输入中生成一个Regex表达式?

我不确定这是否可行。因此,我在这里发布这个问题。

是否有任何工具或网站可以做到这一点?

更多更新: 说我输入像

这样的输入

它应该以某种方式给我一个正则表达式dats接受这种类型的输入......这可能吗?

1 个答案:

答案 0 :(得分:3)

对于您的URL示例,这里是我刚刚在C#中汇总的内容。我认为它会帮助你。

    //   Input "pattern" should consist of a string with ONLY the following tags:
    //   <protocol>  <web>  <website>  <DomainExtension>  <RestOfPath>
    //   Ex) GenerateRegexFor("<protocol><web><webite><domainextension>") will match http://www.google.com
    public string GenerateRegexFor(string pattern)
    {
        string regex = ProcessNextPart(pattern, "");
        return regex;
    }

    public string ProcessNextPart(string pattern, string regex)
    {
        pattern = pattern.ToLower();
        if (pattern.ToLower().StartsWith("<protocol>"))
        {
            regex += @"[a-zA-Z]+://";
            pattern = pattern.Replace("<protocol>", "");
        }
        else if (pattern.ToLower().StartsWith("<web>"))
        {
            regex += @"www\d?"; //\d? in case of www2
            pattern = pattern = pattern.Replace("<web>", "");
        }
        else if (pattern.ToLower().StartsWith("<website>"))
        {
            regex += @"([a-zA-Z0-9\-]*\.)+";
            pattern = pattern.Replace("<website>", "");
        }
        else if (pattern.ToLower().StartsWith("<domainextension>"))
        {
            regex += "[a-zA-Z]{2,}";
            pattern = pattern.Replace("<domainextension>", "");
        }
        else if (pattern.ToLower().StartsWith("<restofpath>"))
        {
            regex += @"(/[a-zA-Z0-9\-]*)*(\.[a-zA-Z]*/?)?";
            pattern = pattern.Replace("<restofpath>", "");
        }
        if (pattern.Length > 0 && pattern != "")
            return ProcessNextPart(pattern, regex);
        return regex;
    }

根据您想要匹配的网址样式,我认为这应该与任何事情和所有内容相匹配。如果存在类似于URL而不是URL的文本,您可能希望更加挑剔。

你会这样使用它:

//to match something like "www.google.com/images/whatever"
//            \
//             \                 |www||.google.||----com------||/images/whatever
//              \                  |     |             |              |
//              \/                 V     V             V              V           
string regex = GenerateRegexFor("<web><website><domainextension><restofpath>");
 //to match something like "http://www.google.com/images/whatever"
string regex = GenerateRegexFor("<protocol><web><website><domainextension><restofpath>");

您可以按任何顺序使用这些标记中的任何一个(尽管其中一些标记没有多大意义)。也可以随意构建。您可以根据需要添加任意数量的标签,以表示任意数量的模式。

哦,还有+1给我在工作中做点什么。