如何有效地将字符串与大量正则表达式进行匹配


How to effectively match a string with lots of regular expressions

我希望能够有效地将一个字符串与多个正则表达式进行匹配,以确定这个字符串代表什么。

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

每当我想匹配一个字符串时,在一个包含所有正则表达式的集合上迭代对我来说太重了

还有什么更有效的方法吗?也许我可以把这些regexp编译成一个大的regexp?也许是像谷歌建议一样的东西,一封又一封地分析?

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

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

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

例如,如果一个字符串与'd不匹配,那么您知道其中没有数字,并且可以跳过所有需要数字的正则表达式。因此(例如)您可以将其缩小到25,而不是与+300正则表达式匹配。

您可以这样总结正则表达式:

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

稍后,如果您获得更多regex,您可以执行以下操作:

^([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...
}

由于正则表达式将要更改,我认为您无法获得通用答案-您的正则表达式和处理它们的方式都需要改进。目前,如果您希望优化脚本的处理,请先测试已知字符串,然后再使用indedOf之类的工具进行评估,以减轻regex负载。

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

  • asdfsdfkjslkujflkj2lkjsdlkf2lkja
  • 100010010100111010100101001001011
  • 10103202130942094038979873987113
  • 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/