如何有效地匹配一个字符串与许多正则表达式

时间:2013-12-05 11:40:56

标签: php mysql regex performance algorithm

我希望能够有效地将字符串与多个正则表达式匹配,以确定此字符串代表的内容。

^[0-9]{1}$         if string matches it is of type 1
^[a-x]{300}$       if string matches it is of type 2
...                ...

每次想要匹配字符串时,迭代包含所有正则表达式的集合对我来说太沉重了。

还有更有效的方法吗?也许我可以将这些正则表达式编译成一个大的?也许像Google建议一样的东西,一字又一字地分析?

在我的项目中,我使用的是PHP / MySQL,但我会感谢任何语言的线索。

编辑: 匹配字符串的操作将非常频繁,字符串值会有所不同。

3 个答案:

答案 0 :(得分:0)

如果可能,您可以做的是将正则表达式组合在一起并确定字符串属于哪个组。

例如,如果字符串与\d不匹配,则表示其中没有数字,您可以跳过所有需要一个数字的正则表达式。所以(例如)而不是匹配+300正则表达式,你可以将其缩小到只有25。

答案 1 :(得分:0)

你可以像这样总结你的正则表达式:

^([0-9])|([a-x]{300})$

稍后,如果你获得更多正则表达式,你可以这样做:

^([0-9])|([a-x]{300})|([x-z]{1,5})|([ab]{2,})$...

然后使用此代码:

$input=...
preg_match_all('#^([0-9])|([a-x]{300})$#', $input, $matches);

foreach ($matches as $val) {
    if (isset($val[1])) {
       // type 1
    } else if (isset($val[2])) {
       // type 2
    }
    // and so on...
}

答案 2 :(得分:0)

由于正则表达式将会发生变化,我认为你不能得到一个通用答案 - 你的正则表达式和你处理它们的方式都需要发展。目前,如果您正在寻求优化脚本的处理,请在使用indedOf之类的内容进行评估之前测试已知字符串,以减轻正则表达式的负担。

例如,如果您有4个字符串:

  • asdfsdfkjslkdujflkj2lkjsdlkf2lkja
  • 100010010100111010100101001001011
  • 101032021309420940389579873987113
  • asdfkajhslkdjhflkjshdlfkjhalksjdf

每个人都属于你所描述的不同“类型”,所以你可以这样做:

//type 1 only contains 0 or 1
//type 2 must have a "2"
//type 3 contains only letters

var arr = [
    "asdfsdfkjslkdujflkj2lkjsdlkf2lkja",
    "100010010100111010100101001001011",
    "101032021309420940389579873987113",
    "asdfkajhslkdjhflkjshdlfkjhalksjdf"
    ];

for (s in arr)
{
    if (arr[s].indexOf('2') > 0)
    {
        //type 2
    }
    else if (arr[s].indexOf('0') > 0)
    {
        if ((/^[01]+$/g).test(arr[s]))
            //type 1
        else
            //ignore
    }
    else if ((/^[a-z]+$/gi).test(arr[s]))
        //type 3
}

在此处查看此行动:http://jsfiddle.net/remus/44MdX/