मैं JMD (Java MarkDown) (MarkDownSharp का जावा पोर्ट) पर काम कर रहा हूं लेकिन मुझे विशेष रूप से एक रेगेक्स के साथ कोई समस्या है। फ़ाइल के लिए Markdown_Documentation_Syntax.text इस नियमित अभिव्यक्ति मर जाता है:जावा रेगेक्स स्टैक ओवरफ़्लो पर मर जाता है: बेहतर संस्करण
private static final String BLOCK_TAGS_1 = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del";
private static final String BLOCKS_NESTED_PATTERN = String.format("" +
"(" + // save in $1
"^" + // start of line (with MULTILINE)
"<(%s)" + // start tag = $2
"\\b" + // word break
"(.*\\n)*?" + // any number of lines, minimally matching
"</\\2>" + // the matching end tag
"[ \\t]*" + // trailing spaces/tags
"(?=\\n+|\\Z)" + // followed by a newline or end of
")", BLOCK_TAGS_1);
जो करने के लिए अनुवाद:
(^<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b(.*\n)*?</\2>[ \t]*(?=\n+|\Z))
यह पैटर्न को स्वीकार कर लिया ब्लॉक टैग है कि एक लाइन के शुरू होने से सहारा लेने लगते हैं की तलाश में है, के किसी भी संख्या के द्वारा पीछा किया रेखाएं और उसके बाद मिलान करने वाले टैग द्वारा एक नई लाइन या स्ट्रिंग टर्मिनेटर के बाद समाप्त कर दिया जाता है। यह उत्पन्न करता है:
java.lang.StackOverflowError
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$LazyLoop.match(Pattern.java:4357)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3782)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$LazyLoop.match(Pattern.java:4357)
...
यह (ओएसएस/एस एस IIRC के लिए चूक 128k/400K करने के लिए) के लिए जावा ढेर अंतरिक्ष में वृद्धि से निपटा जा सकता है लेकिन इसके बाद के संस्करण अभिव्यक्ति वैसे भी धीमी है।
तो मैं एक regex गुरु जो बेहतर कर सकते हैं के लिए देख रहा हूँ (या कम से कम इस पैटर्न के साथ प्रदर्शन समस्या की व्याख्या)। सी # संस्करण थोड़ा धीमा है लेकिन ठीक काम करता है। ऐसा लगता है कि PHP के साथ कोई समस्या नहीं है।
संपादित करें: यह विंडोज 7 64 अल्टीमेट पर चल रहे जेडीके 6u17 पर है।
जो जेडीके संस्करण? – bmargulies
यह नियमित अभिव्यक्तियों का एक भयानक उपयोग है। क्या आपको रेगेक्स का उपयोग करना है या क्या आप इसे वास्तविक रिकर्सिव पार्सर (या तो एलआर या रिकर्सिव वंश) के रूप में पुन: उपयोग कर सकते हैं? –
क्या आपने '। * \ N' से'। *? \ N' के साथ प्रयास किया है? – YOU