2009-07-23 13 views
59

मैच के लिए मुझे लगता है कि इसregex EOF

john, dave, chris 
rick, sam, bob 
joe, milt, paul 

की तरह लग रहा नामों

/(\w.+?)(\r\n|\n|,)/ 

जो सबसे अधिक भाग के लिए काम करता है मिलान करने के लिए इस regex उपयोग कर रहा हूँ कुछ डेटा है, लेकिन फ़ाइल अचानक समाप्त हो जाती अंतिम शब्द के बाद अंतिम मूल्य \r\n, \n या , में समाप्त नहीं होता है, यह ईओएफ के साथ समाप्त होता है। क्या रेफिक्स में ईओएफ से मिलान करने का कोई तरीका है, इसलिए मैं इसे दूसरे समूह में सही रख सकता हूं?

+0

क्या आप एक समूह में सभी नामों को कैप्चर करने की कोशिश कर रहे हैं या प्रति नाम एक कैप्चर समूह? –

+4

यह क्या मंच है? –

+0

रेगेक्स के साथ परेशानी होने पर एक चीज है जो अलगाव में आपके पैटर्न के तत्वों को आजमाएं। यदि आप अंत में टोकन के बारे में चिंतित हैं, तो इसके बिना अपनी अभिव्यक्ति का परीक्षण करें। – akf

उत्तर

117

इस प्रश्न का उत्तर \Z ने इसे समझने में थोड़ी देर लग गई, लेकिन अब यह काम करता है। ध्यान दें कि इसके विपरीत, \A पूरे स्ट्रिंग की शुरुआत से मेल खाता है (जैसा कि ^ और $ के विपरीत एक पंक्ति की शुरुआत से मेल खाता है)।

+3

यदि आप ** ** फाइल फाइलों के लिए netbeans में ऐसी कार्यक्षमता के बाद हैं, तो केवल एक सिर ऊपर ** ** फ़ाइल खोज में ** के विपरीत **, निम्नलिखित अलग-अलग व्यवहार करेंगे ... '(\ s *) \ ?> (\ s *) \ Z' ... और यहां कुछ और खुदाई करने के बाद एक परियोजना फ़ोल्डर पर क्या काम करेगा: '(\ s *) \?> (\ s *) (\ n *) (\ W) \ Z' FYI: यह फ़ाइल के अंत में लाइन ब्रेक द्वारा सभी बंद PHP टैग को प्रतिस्थापित करना है। – MediaVince

+1

'स्टूडियो स्टूडियो में खोजने और बदलने के लिए' \ A' भी काम करता है। हमेशा सावधानी के साथ ऐसी चीजों का उपयोग करते हैं, लेकिन जब मैं खुश था तो उसने मुझे मैन्युअल गड़बड़ी का एक टन बचाया, यह वास्तव में सही काम करेगा। –

+0

जबकि मैं एक ही फाइल को एक बार में पढ़ने के लिए जावा की 'स्कैनर' कक्षा का उपयोग कर रहा हूं; अगर मैं '\ Z' का उपयोग delimiter के रूप में करता हूं, पीछे की रेखा के पीछे छंटनी की विशेषता है। जब मैंने डेलीमीटर को '\ z' में बदल दिया, तो पिछला न्यूलाइन कैरेक्टर संरक्षित। ऐसा लगता है कि [मार्टिन डोरी का जवाब] (https://stackoverflow.com/a/13651321/471214) जावा पर भी लागू होता है। – mmdemirbas

1

मान लें कि आप पूरी तरह से स्ट्रिंग के इलाज के लिए उचित संशोधक का उपयोग कर रहे हैं (लाइन-दर-रेखा नहीं - और यदि \ n आपके लिए काम करता है, तो आप इसका उपयोग कर रहे हैं), बस एक और विकल्प जोड़ें - स्ट्रिंग का अंत: (\ r \ n | \ n |, | $)

0

/(\w.+?)(\r\n|\n|,|$)/

+2

आप शायद '\ w +' का मतलब था, है ना? – Abel

+4

शायद। मुझे अब याद नहीं है :-) – cube

17

EOF वास्तव में एक चरित्र नहीं है। यदि आपके पास बहु-पंक्ति स्ट्रिंग है, तो '$' स्ट्रिंग के अंत के साथ-साथ लाइन के अंत से मेल खाएगा।

पर्ल और उसके भाइयों में, \A और \Z स्ट्रिंग के प्रारंभ और अंत से मेल खाते हैं, पूरी तरह से लाइन-ब्रेक को अनदेखा करते हैं।

POSIX regexes के जीएनयू एक्सटेंशन एक ही चीजों के लिए \` और \' का उपयोग करते हैं।

2

क्या आपको वास्तव में लाइन विभाजक को कैप्चर करना है? यदि नहीं, तो इस regex आप सभी की जरूरत किया जाना चाहिए:

/\w+/ 

सभी सबस्ट्रिंग आप मिलान कराना चाहते संभालने है कि आपके उदाहरण में शब्द पात्रों से बना होता है, की तरह।

2

शायद (\ r \ n | \ n) के बजाय $ (EOL/EOF) आज़माएं?

/\"(.+?)\".+?(\w.+?)$/ 
6

कंट्रास्ट \ जेड के साथ रयान के सुझाव \ जेड के व्यवहार:

 
$ perl -we 'my $corpus = "hello\n"; $corpus =~ s/\Z/world/g; print(":$corpus:\n")' 
:helloworld 
world: 
$ perl -we 'my $corpus = "hello\n"; $corpus =~ s/\z/world/g; print(":$corpus:\n")' 
:hello 
world: 
$ 

perlre एसईजेड:

 
\Z Match only at end of string, or before newline at the end 
\z Match only at end of string 

रूबी (1.8.7, 1.9 में परीक्षण मामले का एक अनुवाद .2) वही व्यवहार करता है।

7

विजुअल स्टूडियो में, आप इस तरह की ईओएफ पा सकते हैं: $(?![\r\n])। यह काम करता है कि आपकी लाइन समाप्ति सीआर, सीआरएलएफ, या सिर्फ एलएफ हैं या नहीं।

एक बोनस के रूप में, आप सुनिश्चित कर सकते अपने सभी कोड फ़ाइलों तो जैसे एक अंतिम न्यू लाइन मार्कर है: यह कैसे काम करता है

   Find What: (?<![\r\n])$(?![\r\n]) 
      Replace With: \r\n 
Use Regular Expressions: checked 
Look at these file types: *.cs, *.cshtml, *.js 

:

किसी भी लाइन अंत (एक शून्य चौड़ाई मैच) का पता लगाएं कि सीआर या एलएफ से पहले नहीं है, और इसके बाद सीआर या एलएफ भी नहीं है। कुछ विचार आपको दिखाएंगे कि यह क्यों काम करता है!

ध्यान दें कि आप अपने वांछित लाइन न खत्म होने वाली चरित्र से बदलना होगा, यह सीआर, वामो, या CRLF हो।

+0

शानदार! धन्यवाद – MikeMurko

0

हाल ही में मैं कुछ इस तरह की तलाश में गया था, लेकिन जावास्क्रिप्ट के लिए।

यहाँ इस लाना, ताकि एक ही मुद्दे के साथ किसी को भी फायदा हो सकता है

var matchEndOfInput = /$(?![\r\n])/gm; 

मूल रूप से इस लाइन है, जो गाड़ी वापसी या नए लाइन वर्ण के बाद नहीं है के अंत से मेल खाएगा। संक्षेप में यह \Z जैसा है लेकिन जावास्क्रिप्ट के लिए है।