[英]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個字符串:
正如您所描述的,每個都屬於不同的“類型”,因此您可以執行以下操作:
//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.