रेगेक्स के साथ एक पंक्ति में केवल पहली घटना का मिलान


42

मैं regex के लिए पूरी तरह से नया हूं और मैं किसी भी मदद की बहुत सराहना करूंगा।

कार्य सरल है। मेरे पास एक CSV फ़ाइल है जिसमें रिकॉर्ड इस तरह से हैं:

12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890

मैं पहले अल्पविराम को एक स्थान से बदलना चाहूंगा और बाकी अल्पविराम को हर पंक्ति के लिए अक्षुण्ण रखना चाहूंगा। क्या कोई रेगेक्स अभिव्यक्ति है जो केवल पहले कॉमा से मेल खाएगी?

मैंने यह कोशिश की ^.....,:। यह कॉमा से मेल खाता है, हालांकि, यह कॉमा से पहले होने वाली स्ट्रिंग की पूरी लंबाई से भी मेल खाता है, इसलिए यदि मैं इसे एक स्थान के साथ बदलने की कोशिश करता हूं तो सभी संख्याओं को भी हटा दिया जाता है।


आप किस उपकरण का उपयोग कर रहे हैं? (sed, पर्ल, awk, कुछ और?)
Mat

जवाबों:


53

मिलान पैटर्न हो सकता है:

^([^,]+),

इसका मत

^        starts with
[^,]     anything but a comma
+        repeated one or more times (use * (means zero or more) if the first field can be empty)
([^,]+)  remember that part
,        followed by a comma

उदाहरण के लिए, पूरे मैच और बदले में ऐसा दिखेगा:

s/^([^,]+),/\1 /

प्रतिस्थापन भाग सिर्फ पूरी चीज को लेता है जो आपके द्वारा याद किए गए पहले ब्लॉक के साथ मेल खाता है और इसे प्रतिस्थापित करता है। कोमा "गिरा दिया गया" है क्योंकि यह पहले कैप्चरिंग ग्रुप में नहीं है।


बहुत बढ़िया! धन्यवाद मैट, यह बहुत अच्छा काम किया। यह वास्तव में टेक्स्टपैड में काम नहीं करता था (मुझे लगता है कि उनका रेगेक्स सीमित है), इसलिए मैंने पावरग्रेप डाउनलोड करना समाप्त कर दिया, और आपके द्वारा प्रदान की गई अभिव्यक्ति के साथ खोज और प्रतिस्थापन का उपयोग किया और यह बहुत अच्छा काम किया। अच्छी व्याख्या के लिए भी धन्यवाद, यह समझने में मदद करता है कि क्या चल रहा है।
cows_eat_hay

7
s/,/ /

यह, डिफ़ॉल्ट रूप से (यानी gविकल्प के बिना ), केवल पहले मैच की जगह लेता है।


1
क्या यह वास्तव में टेक्स्टपैड खोज और सिंटैक्स की जगह है?
डैनियल बेक

1
यह एक सिंटैक्स sed, perlऔर कुछ अन्य उपकरण है।
20

3

यह केवल पहले नंबर और अल्पविराम से मेल खाना चाहिए ^(\d{5}),:। यदि आप पंक्ति में अन्य सभी चीज़ों को प्राप्त करना चाहते हैं, तो regex को इसमें बदलें:^(\d{5}),(.*)$


इसने भी चाल चली। मैं वास्तव में मैट के समाधान का उपयोग कर समाप्त हो गया लेकिन मैंने तुम्हारा भी परीक्षण किया और यह काम करता है। सहायता के लिए धन्यवाद!
cows_eat_hay

क्यों \d{5}और क्या नहीं [^,]*? यह @ कम से कम अधिक सामान्य होगा।
जस्टिनसीबी

2

अधिक सुरुचिपूर्ण समाधान आलसी मिलान का उपयोग करना है:

s/^(.+?),/\1 /

यह स्ट्रिंग के प्रारंभ ( ^) से अंत तक एक वर्ण ( .+?) द्वारा प्रत्येक चरण पर चलते हुए समूह वर्ण होगा जब तक कि यह पहला अल्पविराम चिह्न न हो जाए। पहले अल्पविराम के साथ यह सब समूह समूह ( \1) और अंतरिक्ष चरित्र द्वारा प्रतिस्थापित किया जाएगा ।


ध्यान दें कि यह उस पंक्ति से मेल नहीं खाएगा जिसमें अल्पविराम (एक पंक्ति में एक एकल मान) नहीं है। मेल खाने वाले किसी भी * हो सकता है एक बेहतर हो +तोs/^(.*?),/\1 /
जेफ Puckett

आप यह भी कर सकते हैं s/^([^,]*),/\1 /, जो प्रारंभ से मेल खाए, कुछ भी अल्पविराम से नहीं, फिर एक अल्पविराम से। इसके अलावा, क्या आप नहीं जानते कि s//यह किसी भी चीज़ से मेल नहीं खाता है?
जस्टिनसीबी

1

टेक्स्टपैड में हमेशा पॉज़िक्स नोटेशन का उपयोग करने की क्षमता होती है, लेकिन आपको एक अलग संवाद बॉक्स में सेटिंग्स को बदलना होगा। नियमित अभिव्यक्ति के लिए टेक्स्टपैड की डिफ़ॉल्ट सेटिंग्स का उपयोग करने के लिए, आपको कोष्ठक खोलने और बंद करने से बचना होगा:

प्रत्येक पंक्ति की शुरुआत में 5-अंकीय ज़िप कोड के बाद स्थान बदलें

^\([0-9]+\)[ ]

टैब के साथ

\1\t

ऊपर के रूप में, ^ का मतलब लाइन की शुरुआत है

\ "एक बचा हुआ कोष्ठक" है और यह पहली खोज अभिव्यक्ति की शुरुआत को चिह्नित करता है, अर्थात, पांच अंक

[0-9] + का अर्थ है एक या अधिक अंक (केवल ५-अंकीय ज़िप कोड नहीं)

पहली खोज अभिव्यक्ति के अंत को चिह्नित करने के लिए एक और "बच गए कोष्ठक" है

[] केवल एक अंतरिक्ष पात्र है (आप कोष्ठक को छोड़ सकते हैं, लेकिन तब कोई भी इसे इस वेब पेज पर नहीं देख सकेगा :-)

प्रतिस्थापन अभिव्यक्ति में

\ 1 पहली खोज अभिव्यक्ति है, ऊपर कोष्ठक के बीच का हिस्सा (एक या अधिक अंक)

\ t एक टैब वर्ण है

तो एक या अधिक अंकों के लिए खोज और प्रतिस्थापित कमांड दिखता है, उसके बाद एक स्थान होता है। फिर यह एक टैब के बाद अंकों के एक ही समूह के साथ सभी को बदल देता है।

मुझे नहीं लगता कि बस "5 अंकों के बाद आने वाली जगह" खोजने का कोई तरीका है, इसलिए आप केवल अंकों को छूने के बिना अंतरिक्ष को बदल सकते हैं। आपको 5 अंक (पहला स्ट्रिंग) और उसके बाद अंतरिक्ष (दूसरा स्ट्रिंग) खोजना होगा। फिर, हालांकि यह बेमानी या बोझिल लगता है, ITSELF के साथ 5 अंकों के मूल स्ट्रिंग को REPLACE, इसके बाद टैब (दूसरा स्ट्रिंग)।

हर कोई जो यह जानता है वह भूल जाता है कि newbies को इस बारे में कोई पता नहीं है। इसलिए मैं इसे तुम्हारे लिए, मेरे दोस्त की वर्तनी कह रहा हूं।

एड पुअर मठ ट्यूटर और सेवानिवृत्त कंप्यूटर प्रोग्रामर न्यूयॉर्क शहर


0

किसी भी regex अभिव्यक्ति की केवल पहली घटना से मेल खाने के लिए सभी झंडे हटा दें। प्रत्येक regex अभिव्यक्ति निम्नलिखित संभव झंडे के साथ आती है और आमतौर पर वैश्विक ध्वज का उपयोग करने में चूक करती है जो एक से अधिक घटनाओं से मेल खाएगी:

  • / g = इस ध्वज के साथ खोज सभी मैचों के लिए दिखती है, इसके बिना - केवल पहला मैच लौटा है
  • / i = केस असंवेदनशील
  • / m = मल्टी लाइन मोड
  • / एस = सभी। मैच के लिए newline character \ n
  • / यू = यूनिकोड
  • / y = चिपचिपा मोड (विशिष्ट स्थान में खोज)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.