2013-08-01 12 views
5

मैं अपने ऐप में एक समस्या को डीबग करने की कोशिश कर रहा हूं, जिसे मैंने नियमित अभिव्यक्ति से जोड़कर एक विशेष परिस्थिति में संकुचित कर दिया है जिससे क्रोम को चकित कर दिया जाता है! फ़ायरफ़ॉक्स में एक ही कोड का प्रयास करना ठीक काम करता है। इसके अलावा यदि मैं इस पर रेगेक्स चलाने के लिए अपना 'नमूना' टेक्स्ट भी कम करता हूं तो भी काम करता है।यह कोड क्रोम को क्यों दबाता है?

तो क्या देता है? http://jsfiddle.net/XWKRb/1/

कोड मैं jsfiddle में डाल दिया है (जो के रूप में मैं कर रहा हूँ क्योंकि क्रोम यदि आप एक ही परिणाम हो रही है गला घोंटना होगा बिल्कुल प्रारंभ करने में असफल हो जायेगी) है:

यहाँ jsfiddle है

var rgx = /^(\d+([,|;]?\d*))*$/; 
var sample = '40162690,40162755,40162691,40168355,40168357,40162726,40162752,40162729,40428707 ,40162740,40162546'; 
alert("Test is "+rgx.test(sample)); 

शायद इस मुद्दे से बचने के लिए मेरी नियमित अभिव्यक्ति लिखने का एक बेहतर तरीका है? लक्ष्य नियमित अभिव्यक्ति को संख्याओं की एक स्ट्रिंग पकड़नी चाहिए जो अल्पविराम या अर्ध-कॉलन से अलग होती है।

^(\d+([,|;]?\d*))*$ 
    ^ ^^^
    |  | | ---- zero or more repetitions of the group 
    |  | ------- zero or more digits 
    |  ---------- zero or one comma, pipe or semicolon 
    ----------------- one or more digits 

एक दोहराया समूह है जो वैकल्पिक तत्वों, जिनमें से एक ही बार-बार होता है शामिल हैं:

+0

'जानबूझकर sample' में है कि अंतरिक्ष है? –

+1

मैं पुष्टि कर सकता हूं कि यह विंडोज 7 64-बिट –

+0

पर Google क्रोम v28 को तोड़ता है यह बग केवल तब दिखाई देता है जब नमूना स्ट्रिंग के भीतर कोई स्थान होता है। –

उत्तर

13

आप catastrophic backtracking का एक क्लासिक मामला है। अब के लिए विभाजक की अनदेखी करते हुए आप अनिवार्य रूप से regex

^(\d+\d*)*$ 

कि आपके रेगुलर एक्सप्रेशन से सबसे खराब स्थिति में जांच करने के लिए है क्रमपरिवर्तन की एक घातीय संख्या की ओर जाता है है।

जैसे ही अनुमत वर्णों के अलावा एक और चरित्र आपकी स्ट्रिंग में पाया जाता है (आपके उदाहरण में एक जगह की तरह), रेगेक्स को असफल होना चाहिए - लेकिन यह इंजन उम्र को समझने के लिए लेता है। कुछ ब्राउज़र ऐसे रनवे रेगेक्स मैचों का पता लगाते हैं, लेकिन क्रोम इसे सवारी करना चाहता है।

इसे दर्शाने के लिए, RegexBuddy में अपने रेगुलर एक्सप्रेशन से परीक्षण से पता चलता है:

Input    Steps to determine a non-match 
1,1X     23 
12,21X    119 
123,321X    723 
1234,4321X   4,743 
12345,54321X  31,991 
123456,654321X 217,995 
1234567,7654321X attempt aborted after 1,000,000 steps 
+0

दोहराए गए समूह में एक गैर-वैकल्पिक तत्व '\ d +' है। –

+0

@ लाइटनेसरेसेसिन ऑर्बिट: आप सही हैं; समस्या अभी भी वही है, यद्यपि। –

+1

इस समस्या के स्पष्टीकरण के लिए धन्यवाद! – Trant

4

यह पैटर्न बेहतर काम करेगा:

var rgx = /^\d+(?:[,;]\s*\d+)*$/; 
+0

हालांकि यह खाली स्ट्रिंग को स्वीकार नहीं करता है .. सुनिश्चित नहीं है कि मूल – Esailija

+0

हाँ में यह महत्वपूर्ण था, यह regex एक ही अंतहीन पाश के बिना नौकरी करता है - धन्यवाद !! – Trant

+0

@ टेंट: यह एक अंतहीन पाश से अलग है, और कोशिश करने के लिए बहुत अधिक संभावनाएं हैं। –

संबंधित मुद्दे