Skip to content

Instantly share code, notes, and snippets.

@aya-eiya
Created July 12, 2013 11:11
Show Gist options
  • Save aya-eiya/5983669 to your computer and use it in GitHub Desktop.
Save aya-eiya/5983669 to your computer and use it in GitHub Desktop.
ちょっとしたことがGroovy「めちゃくちゃ重い正規表現をどうにかする確認」 ref: http://qiita.com/aya_eiya/items/4bae8e2dbde97ed248bb
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