EOF से मिलान करने के लिए regex


90

मेरे पास कुछ आंकड़े हैं जो इस तरह दिखते हैं

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

मैं नामों का मिलान करने के लिए इस regex का उपयोग कर रहा हूं

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

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


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

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

: केवल एक महान regex परीक्षण साइट जोड़ना चाहते थे regexplanet.com/simple
northpole


@ सीन - मैं सहमत हूँ; विलय कर दिया
मार्क Gravell

जवाबों:


160

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


5
प्रोजेक्ट हेड फाइल्स के लिए नेटबैंस में इस तरह की नाटकीयता के बाद अगर आप एक हेड अप हैं, तो फाइल सर्च में विरोध के रूप में , निम्नलिखित अलग तरीके से व्यवहार करेगा (\s*)\?>(\s*)\Z... और यहां कुछ और खुदाई के बाद प्रोजेक्ट फ़ोल्डर पर काम करना होगा : (\s*)\?>(\s*)(\n*)(\W)\Z FYI करें: यह फ़ाइल के अंत में लाइन ब्रेक द्वारा सभी समापन php टैग को बदलना है।
MediaVince

1
\AVisual Studio खोज और प्रतिस्थापित में भी टर्न आउट काम करता है। हमेशा सावधानी के साथ इस तरह की चीजों का उपयोग करें, लेकिन इसने मुझे एक टन मैनुअल मेसिंग करने से बचाया क्योंकि मैं खुश था कि यह वास्तव में सही काम करेगा।
स्टीव पेटीफ़र

जबकि मैं Scannerएक बार में एक पूरी फ़ाइल पढ़ने के लिए जावा की कक्षा का उपयोग कर रहा हूं ; अगर मैं \Zसीमांकक के रूप में उपयोग करता हूं , तो अनुगामी न्यूलाइन वर्ण छंटनी की जाती है। जब मैंने सीमांकक को बदल दिया \z, तो संरक्षित नईलाइन चरित्र को। ऐसा लगता है कि मार्टिन डोरे का उत्तर जावा पर भी लागू होता है।
एमएमडेमीरबास

24

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

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

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


17

Visual Studio में, आप EOF को इस तरह पा सकते हैं: $(?![\r\n]) । यह काम करता है कि क्या आपकी लाइन एंडिंग सीआर, सीआरएलएफ, या सिर्फ एलएफ है।

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

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

यह कैसे काम करता है:

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

ध्यान दें कि आपको अपने इच्छित लाइन-एंड कैरेक्टर के साथ रिप्लेस होना चाहिए, चाहे वह सीआर, एलएफ या सीआरएलएफ हो।


विजुअल स्टूडियो 2019 में एक बग है, जहां सभी को प्रतिस्थापित करने के परिणामस्वरूप फ़ाइल के अंत में दो नए समाचार जोड़े जा सकते हैं। मुझे लगता है कि सेव ऑप्शन पर ऑटो-इंसर्ट न्यूलाइन के साथ कुछ करना है।
स्टेवोइसेक

9

रयान के सुझाव के विपरीत \ z के साथ \ z का व्यवहार करें:

$ perl -we 'my $ corpus = "hello \ n"; $ कॉर्पस = ~ s / \ Z / दुनिया / जी; प्रिंट ( ": $ कोष: \ n") '
:नमस्ते दुनिया
विश्व:
$ perl -we 'my $ corpus = "hello \ n"; $ कॉर्पस = ~ s / \ z / दुनिया / जी; प्रिंट ( ": $ कोष: \ n") '
:नमस्कार
विश्व:
$ 

पर्ल सेज:

\ Z केवल स्ट्रिंग के अंत में, या अंत में newline से पहले मैच
\ z केवल स्ट्रिंग के अंत में मेल खाता है

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


2

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

/\w+/

यह मानते हुए कि आप जिन सभी उपादानों का मिलान करना चाहते हैं, वे आपके उदाहरण में जैसे पूरी तरह से शब्द वर्णों से मेल खाते हैं।



2

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

इसे यहां रखा जाए, ताकि उसी मुद्दे वाले किसी को भी फायदा हो सके

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

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


1

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


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.