神奇的java正则表达式

founder 发布于 2011/02/21 15:16
阅读 992
收藏 2

项目里用正则表达来匹配解析cookie,表达为: private final static Pattern PATTERN =

        Pattern.compile("(?:\\s|[;,])*\\$*([^;=]+)(?:=(?:[\"']((?:\\\\.|[^\"])*)[\"']|([^;,]*)))?(\\s*(?:[;,]+\\s*|$))");(代码来自开源项目netty的CookieDecoder)

代码上线后,偶尔报错误log:    java.lang.StackOverflowError
        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4166)
        at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
        at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
        at java.util.regex.Pattern$BranchConn.match(Pattern.java:4078)
        at java.util.regex.Pattern$CharProperty.match(Pattern.java:3345)
        at java.util.regex.Pattern$Branch.match(Pattern.java:4114)
        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
        at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
        at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
        at java.util.regex.Pattern$BranchConn.match(Pattern.java:4078)
        at java.util.regex.Pattern$CharProperty.match(Pattern.java:3345)
        at java.util.regex.Pattern$Branch.match(Pattern.java:4114)
        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
        at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
        at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
      很长,略。
初步认为是请求头的cookie值含有特殊的符号造成stackOverflowError,但把这个出错的cookie的值放在本地机器跑,没有出错,正常解析,更诡异的是,就算是同样的cookie值在线上服务器也是有时候才出错,有时候却完全正常(排除多线程并发的问题,本身java.util.regex.Pattern是线程安全的,另外是单人手工测试,用btrace跟踪确认),如此执行结果不确定,还不说正则本身的性能问题(一字烂),唉!
  线上jdk是sun 64bit jdk1.6_18,正则也是jdk自带的

加载中
0
frankiegao123
frankiegao123

使用 \\s 后再使用 | 的话就会出现这样的问题,原因不明

0
baeeq
baeeq

用正则抛StackOverflowError问题我也遇到过几次,我也没去仔细深究,我一般处理办法是重写等价的正则,哈哈

如果2楼哥们说的属实,你可以把“(?:\\s|[;,])”改成“(?:[\\s;,])”试试~!~

0
北柯一梦
北柯一梦
同样的问题,google ing ...
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部