2012-07-08 20 views
5

यह क्यों काम नहीं करता है?ग्रोवी: मुझे स्क्वायर ब्रैकेट से बचने की आवश्यकता क्यों है?

"hello[world".split("\[") 

और इस करता है:

"hello[world".split("\\[") 
+6

अलावा @Don Roby जवाब , यदि आप एक ग्रोवी रेगेक्स का उपयोग करते हैं तो आप '/ \ [/ 'वाक्यविन्यास का उपयोग करके डबल एस्केप को शॉर्टकट कर सकते हैं। – matcauthon

उत्तर

5

यह वास्तव में तथ्य यह है कि तर्क को रेगुलर एक्सप्रेशन के एक स्ट्रिंग के रूप में प्रतिनिधित्व है की वजह से विभिन्न संदर्भों में दो पलायन है।

[ से बच निकलना है क्योंकि अन्यथा नियमित अभिव्यक्ति में इसका विशेष अर्थ होगा। नियमित अभिव्यक्ति के लिए भागने से यह \[ बन जाएगा। लेकिन फिर \ से बच निकलना होगा क्योंकि इसमें स्ट्रिंग में विशेष अर्थ है (भागने के लिए और संख्यात्मक मूल्य से वर्णों का प्रतिनिधित्व करने के लिए)।

यह बहुत खराब हो सकता है, क्योंकि \ चरित्र दोनों संदर्भों में भागने के लिए उपयोग किया जाता है। यदि आप \ वर्ण से विभाजित करना चाहते हैं, तो आपको नियमित अभिव्यक्ति उपयोग के लिए इसे (\\) से बचाना होगा, लेकिन फिर आपके पास दो \ वर्ण हैं, जिन्हें दोनों को स्ट्रिंग संदर्भ में भागना होगा। मूल स्ट्रिंग में उपयोग आप बंटवारे हैं भी, भागने की आवश्यकता होगी आप एक निरंतर के रूप में यह लिख रहे हैं यदि ऐसा है तो अनुरूप विभाजन दिखाई देगा:

"hello\\world".split("\\\\") 
1

ग्रूवी के विभिन्न संस्करणों विभिन्न परिणाम देते हैं।

ग्रूवी 1.1-बीटा -1 और उसके बाद के लिए,

assert "hello[world".split("\\[") == ["hello", "world"] 

ठीक दावा है, लेकिन ग्रूवी 1.0 और इससे पहले कि एक अभिकथन त्रुटि देता है।

assert "hello[world".split(/\[/) == ["hello", "world"] 

1,1-बीटा -1 के बाद से सभी संस्करणों, ग्रूवी 1.0 करने के लिए 1.0-JSR-01 एक अभिकथन त्रुटि देता है के लिए ठीक दावा है, ग्रूवी 1.0 बीटा 10 और इससे पहले कि एक शाब्दिक त्रुटि देता है, जबकि।

"hello[world".split("\\[").each{println it} 
1,0-बीटा-5, और बीटा 3 से ग्रूवी के सभी संस्करणों के लिए

, प्रिंट

hello 
world 

लेकिन 1.0 बीटा 4 प्रिंट

[.] 
[.] 
hello 
world 
संबंधित मुद्दे