Created
July 12, 2013 11:11
-
-
Save aya-eiya/5983669 to your computer and use it in GitHub Desktop.
ちょっとしたことがGroovy「めちゃくちゃ重い正規表現をどうにかする確認」 ref: http://qiita.com/aya_eiya/items/4bae8e2dbde97ed248bb
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.regex.Matcher | |
import java.util.regex.Pattern | |
def stopWatch = {c-> | |
s = System.nanoTime() | |
c() | |
def w = System.nanoTime() - s | |
if(w < 1000000) | |
"${w / 1000} [microsec]" | |
else if(w < 1000000000) | |
"${w / 1000000} [millsec]" | |
else | |
"${w / 1000000000} [sec]" | |
} | |
def slowMatch = {target -> | |
def r | |
def m = Pattern.compile(/[^.,;]{30,}(ABCD)/).matcher(target) // <- 後ろから読み直しちゃうよ。。。O(n^2) | |
println "slow=" + stopWatch { | |
r = m.find() | |
} | |
(r)?m.group().length():r | |
} | |
def fastMatch = {target -> | |
def r = false | |
def p = Pattern.compile(/[^.,;]{30}(ABCD)/) | |
def m = p.matcher(target) | |
def l = [] | |
def ret | |
println "fast=" + stopWatch { | |
if(m.find()) | |
for(def s:target.split(/[.,;]/)){ | |
if(s.length() >= 34){ | |
def m2 = p.matcher(s) | |
r = m2.find() | |
if(r) { | |
ret = s | |
break | |
} | |
} | |
} | |
} | |
(r)?ret.length():r | |
} | |
[ | |
case01:"0123456789", | |
case02:"0123456789"*2, | |
case03:"0123456789"*3, | |
case04:"0123456789"*3+".", | |
case05:"0123456789"*2.9+".", | |
case06:"0123456789"*2.9+".ABCD.", | |
case07:"0123456789"*3+".ABCD.", | |
case08:"0123456789"*3+":ABCD.", | |
case09:"0123456789"*3+".ABCD.ABCD.", | |
case10:"0123456789"*3+":ABCD.ABCD.", | |
case11:"0123456789"*2000+".ABCD.", // <- このときにslowが遅い死ぬほど重い。なぜかってぇと後ろから読み直して結局見つからないから | |
case12:"0123456789"*2000+":ABCD.", // <- このときだけfastのが遅い、なぜかってぇと一致が最後方にあるから | |
case13:"0123456789.ABCD."*500, | |
case14:"0123456789.ABCD."*500+"0123456789"*3+"ABCD.", | |
cale15:"" | |
].collect { k,v -> | |
println k | |
def result = slowMatch(v) | |
assert result == fastMatch(v) | |
["$k":result] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment