簡體   English   中英

Ruby可伸縮字符串匹配

[英]Ruby Scalable String Match

我想非常快速地將字符串字典與模式字典匹配。

我有10000個長度為255的輸入,和10000個長度為20的模式,我需要非常快速地匹配這些字符串,並且我需要知道哪些模式與哪些輸入匹配。

我的模式需要支持正則表達式匹配。 現在,我將所有內容存儲在mysql數據庫中,並在mysql中使用regex調用來執行所需的操作。 例如:

patterns.each do |p|
  select * from inputs where inputs.value regex #{p}
end

但是隨着我擁有更多的模式,這將變得越來越慢。 我還考慮過:

patterns.each do |p|
  inputs.grep(p)
end

但是當我有太多模式時,也會遇到同樣的問題。 我想在ruby中創建DFA並將其存儲在內存中(獨立的工作進程),直到需要它為止,但是我沒有足夠的資源來執行類似的操作。

如果您不需要匹配項,則只需合並正則表達式即可; 那么速度就是C。概念證明:

# prepwork:
# make 676 two-letter patterns plus a digit
patterns = ('a'..'z').flat_map { |x| ('a'..'z').map { |y| x + y + "\\d" } }
# convert to regexp
regexp = Regexp.union(patterns.map{ |pattern| /(#{pattern})/ })

# matching:
# match
match = regexp.match("mu5")
# find out which pattern was hit
if match
  puts patterns[match.captures.find_index { |x| x }]
  # => mu\d
end

如果需要查看命中了哪種模式,則可以不使用任何捕獲括號,或者需要重寫我的示例以使用命名捕獲而不是普通捕獲,這應該不太難。

編輯:如果你不需要看哪個模式被擊中,你也許可以通過從正則表達式的括號,更換加快速度/(#{pattern})//#{pattern}/ ,使不匹配不需要每次都創建一個巨大的數組。

暫無
暫無

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

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