【发布时间】:2013-08-09 23:45:48
【问题描述】:
我是java新手。我在正则表达式 strHindiText 中收到 java Stack overflow 异常。 我该怎么做?
try {
// This regex convert the pattern "{\fldrslt {\fcs1 \ab\af24 \fcs0 ऩ}{"
// into "{\fldrslt {\fcs1 \ab\af24 \fcs0 ऩ}}}{"
// strHindiText = strHindiText.replaceAll("\\{(\\\\fldrslt[ ])\\{((\\\\\\S+[ ])+)((\\s*&#\\d+;\\s*(-|,|/|\\(|\\)|\"|;|\\.|'|<|>|:|\\?)*)+)\\}\\{","{$1{$2$4}}}{");
// This regex convert the pattern "{\fcs0 \af0 ऩ{ or {\fcs0 \af0 *\tab ऩ{"
// into "{\fcs0 \af0 ऩ }{"
strHindiText = strHindiText.replaceAll("\\{\\s*((\\\\\\S+[ ](\\*)?)+\\s*)(-|,|/|\\(|\\)|\"|;|\\.|'|<|>|:|\\?)*[ ]*(((&#\\d+;)[ ]*(-|,|/|\\(|\\)|\"|;|\\.|'|<|>|:|\\?)*[ ]*)+)\\{", "{$1 $4$5 }{");
// This regex convert the pattern "{ऩ \fcs0 \af0 {"
// into "{ऩ \fcs0 \af0 }{"
strHindiText = strHindiText.replaceAll("\\{\\s*(((&#\\d+;)[ ]*(-|,|/|\\(|\\)|\"|;|\\.|'|<|>|:|\\?)*[ ]*)+)[ ]*((\\\\\\S+[ ])+)\\{", "{$1 $5 }{");
} catch(StackOverflowError er) {
System.out.println("Third try Block StackOverflowError in regex pattern to reform the rtf tags................");
er.printStackTrace();
// throw er;
}
每当这些 strHindiText 包含大数据时,它都会给出 java stackoverflow 异常:
java.lang.StackOverflowError
2013-08-08 15:35:07,743 ERROR [STDERR] (http-127.0.0.1-80-9) at java.util.regex.Pattern$Curly.match0(Pattern.java:3754)
2013-08-08 15:35:07,743 ERROR [STDERR] (http-127.0.0.1-80-9) at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
2013-08-08 15:35:07,744 ERROR [STDERR] (http-127.0.0.1-80-9) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
2013-08-08 15:35:07,744 ERROR [STDERR] (http-127.0.0.1-80-9) at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
2013-08-08 15:35:07,745 ERROR [STDERR] (http-127.0.0.1-80-9) at java.util.regex.Pattern$Curly.match0(Pattern.java:3782)
2013-08-08 15:35:07,745 ERROR [STDERR] (http-127.0.0.1-80-9) at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
我的 strHindiText 数据是:
`{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf21\insrsid13505584 भोपाल  । \par }\pard\plain \ltrpar\s16\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\sl240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid13505584 \cbpat20 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 \cs21\b\f1\fs18\cf21\insrsid13505584 अन्वेषण करें  :}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf21\insrsid13505584 \par भोपाल , मध्य प्रदेश की राजधानी प्राकृतिक सुंद`
【问题讨论】:
-
您的替代路径
|可能会导致递归调用,从而导致堆栈溢出。正则表达式的东西通常很复杂,而且你的正则表达式很大。我并不感到惊讶。 -
我建议不要使用替代符号(例如
a|b|c)来使用替代符号:[abc],这应该使正则表达式更清晰,您只需要转义右括号而不是其他字符.此外,您似乎想要做一些正则表达式不适合的事情 - 解析 - 对于不是文本但具有更高顺序的东西。 -
你真的不应该使用
RegEx进行如此庞大的解析。它的性能不是很好,因为每次你尝试匹配一个字符串时,正则表达式都会编译。 -
您的代码的一切都是询问的问题。尝试将问题分解为多个小问题,而不是尝试使用巨大的正则表达式一次完成大量事情。根据您使用的正则表达式,如果您没有遇到内存问题,我会感到惊讶。
-
我个人建议为您的 RTF 编写解析器,而不是尝试使用正则表达式对其进行拆分。正则表达式适用于简单的事情,我认为印地语中的 RTF 一点也不简单。
标签: java regex stack-overflow