簡體   English   中英

如何有效地將字符串與大量正則表達式匹配

[英]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
...                ...

每次我想匹配一個字符串時,都要對包含所有正則表達式的集合進行迭代,這對我來說太麻煩了。

有沒有更有效的方法? 也許我可以將這些正則表達式編譯成一個大的正則表達式? 也許像Google Recommendations這樣的東西可以分析一個又一個字母嗎?

在我的項目中,我正在使用PHP / MySQL,但是對於任何語言的線索我都會感激不盡。

編輯:匹配字符串的操作將非常頻繁,並且字符串值將有所不同。

如果可能的話,您可以做的就是將正則表達式分組在一起,並確定字符串屬於哪個組。

例如,如果字符串與\\d不匹配,則說明其中沒有數字,您可以跳過所有需要一個的正則表達式。 因此(例如)您可以將其范圍縮小到25個,而不是與+300個正則表達式匹配。

您可以像這樣總結您的正則表達式:

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

由於正則表達式將會發生變化,因此我認為您無法獲得一個通用的答案-您的正則表達式和處理它們的方式都將有所發展。 現在,如果您要優化腳本的處理,請在評估之前使用indedOf東西測試已知字符串,以減輕正則表達式的負擔。

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

  • asdfsdfkjslkdujflkj2lkjsdlkf2lkja
  • 10001001010011101010010100100101011
  • 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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM