रेगेक्स: एक चरित्र की पहली घटना तक मेल खाता है


356

मैं एक ऐसे पैटर्न की तलाश में हूं जो एक विशिष्ट चरित्र की पहली घटना तक सब कुछ से मेल खाता है , "a;" - एक अर्धविराम

मैंने यह लिखा:

/^(.*);/

लेकिन यह वास्तव में अर्धविराम की अंतिम घटना तक (अर्धविराम सहित) सब कुछ मेल खाता है।


65
/^(.*?);/भी काम करना चाहिए (इसे गैर-लालची कहा जाता है ), लेकिन दिए गए जवाब [^;]*बेहतर हैं।
पास्कल

अर्धविराम के बाद आप सब कुछ कैसे चुनेंगे, और अर्धविराम ही नहीं।
मुहम्मद उमर

यह काम देखता है, \w+(?!([^]+;)|;)लेकिन यह क्यों नहीं करता है? .+(?!([^]+;)|;)
मुहम्मद उमर

1
पास्कल, आपको उत्तर के रूप में लिखना चाहिए था!
शॉन केंडल

@ पास्कल यह उत्तर के रूप में उपयुक्त है! धन्यवाद!
neverMind9

जवाबों:


503

आप की जरूरत है

/[^;]*/

[^;]एक है चरित्र वर्ग है, यह सब कुछ है, लेकिन एक अर्धविराम मेल खाता है।

perlreमैनपेज का हवाला देने के लिए :

[]] में वर्णों की एक सूची संलग्न करके, आप एक वर्ण वर्ग निर्दिष्ट कर सकते हैं, जो सूची के किसी भी वर्ण से मेल खाएगा। यदि "[" "" ^ "के बाद पहला वर्ण होता है, तो वर्ग सूची में किसी भी वर्ण से मेल खाता है।

यह अधिकांश रेगेक्स बोलियों में काम करना चाहिए।


इस समाधान के बारे में महान हिस्सा यह भी है कि लाइन के अंत से मेल खाता है, उदाहरण के लिए मेरे मामले में मेरे पास था foo=bar;baz=bax;bab=bafऔर यह मिलान bab=bafभी हुआ कि ;वास्तव में मुझे कोई ज़रूरत नहीं है। यह निश्चित नहीं है कि यह क्यों काम करता है, यदि कल्पना कहती है कि सब कुछ मेल खाता है, लेकिन लक्ष्य प्रतीक ...
21

303

होगा,

/^(.*?);/

काम?

?एक आलसी ऑपरेटर, तो regex मिलान से पहले संभव के रूप में छोटे रूप में पकड़ लेता है ;


4
फिर, लेकिन टिम टोइडी के बाइकार्बोनेट विस्तार के बाद, मेरा मानना ​​है कि नकारात्मक चरित्र वर्ग जीतते हैं क्योंकि आलसी क्वांटिफायर में बैकट्रैकिंग शामिल है। वैसे भी +1।
अमरघोष

3
प्रदर्शन विषय पर वर्थ पढ़ना: blog.stevenlevithan.com/archives/greedy-lazy-performance
ग्लेन

38

/^[^;]*/

[^;] कहते हैं कि अर्धविराम के अलावा कुछ भी मेल खाता है। वर्ग कोष्ठक एक सेट मिलान ऑपरेटर हैं, यह अनिवार्य रूप से, वर्णों के इस सेट में किसी भी चरित्र से मेल खाते हैं, ^शुरुआत में यह एक उलटा मैच बनाता है, इसलिए इस सेट में कुछ भी मिलान करें।


3
विदित हो कि इस उत्तर में पहला ^ रेगेक्स को पूरी तरह से अलग अर्थ देता है: यह नियमित अभिव्यक्ति को केवल स्ट्रिंग की शुरुआत से शुरू होने वाले मैचों के लिए बनाता है। इस मामले में, यदि आप केवल एक बार नियमित अभिव्यक्ति चलाते हैं, तो यह प्रभावी रूप से एक विकल्प नहीं होगा । यदि आप एक स्ट्रिंग के भीतर कई मैचों को देखना चाहते हैं, तो पहले ^ को जाना होगा।
डैन ब्रेसलाउ

4
उन्होंने कहा कि वह एक अर्धविराम की पहली घटना तक सब कुछ मैच करना चाहते थे, इसलिए मैंने मान लिया कि उनका मतलब स्ट्रिंग की शुरुआत से था।
ग्लेन स्लेवेन



8

नमूना पाठ:

"this is a test sentence; to prove this regex; that is g;iven below"

यदि उदाहरण के लिए हमारे पास ऊपर नमूना पाठ है, तो रेगेक्स /(.*?\;)/आपको अर्धविराम ( ;) सहित अर्धविराम की पहली घटना तक सब कुछ देगा :"this is a test sentence;"


3
यह आवश्यक नहीं है ;क्योंकि यह विशेष चरित्र है regex नहीं है। समूहन ()की भी आवश्यकता नहीं है। आप /.*?;/
अलकासी कलियुचनिकौ

1
हां, आप काफी सही हैं। पलायन "सॉरी से बेहतर सुरक्षित" की तरह था
पोंसियस

2
यह वह उत्तर है जिसकी मुझे तलाश थी। ऐसा ? मैच पहली घटना पर समाप्त होता है? इस का नाम क्या है ... (इसे कॉल करें) रेगेक्स की संपत्ति?
परज़िफ़ल

1
@Parziphal ?चरित्र मैच को आलसी बनाता है (जितना संभव हो कम बार मेल खाता है)। रेगेक्स से मेल खाने वाले पात्रों के बारे में पहले अर्धविराम तक सोचें, यह किसी भी तरह से आगे नहीं बढ़ता है क्योंकि यह ऊपर (आलसी?) देता है
derekantrican

5

यह एक रेगेक्स समाधान नहीं है, लेकिन आपकी समस्या के वर्णन के लिए पर्याप्त सरल है। बस अपनी स्ट्रिंग को विभाजित करें और अपने सरणी से पहला आइटम प्राप्त करें।

$str = "match everything until first ; blah ; blah end ";
$s = explode(";",$str,2);
print $s[0];

उत्पादन

$ php test.php
match everything until first

5

यह मेरे लिए बहुत मददगार था क्योंकि मैं यह पता लगाने की कोशिश कर रहा था कि एक्सएमएल टैग में सभी वर्णों का मिलान कैसे किया जा सकता है। मैं "अंत से सब कुछ मेल खाता है" समस्या में चल रहा था:

/<simpleChoice.*>/

लेकिन इस मुद्दे को हल करने में सक्षम था:

/<simpleChoice[^>]*>/

इस पोस्ट को पढ़ने के बाद। सबको शुक्रीया।


1
मैंने पाया था कि यह वास्तव में पार्स करने के लिए अधिक कुशल है (प्रत्येक भाषा या फ्रेमवर्क के लिए इसकी अपनी कक्षाएं हैं) html / xml क्योंकि यह मशीन प्रारूप है, रेगेक्स प्राकृतिक भाषा के लिए हैं।
लियोन फेडोटोव

1
अच्छा लगा। मैंने इसका उपयोग <!DOCTYPE>टैग में सिंटैक्स त्रुटियों के साथ xml दस्तावेज़ों को ठीक करने के लिए किया । चूंकि पार्सर इसे संभाल नहीं पा रहा था।
मार्टिन श्नाइडर

5

यह केवल प्रत्येक स्ट्रिंग में पहली घटना तक मेल खाएगा और बाद की घटनाओं को अनदेखा करेगा।

/^([^;]*);*/

3

"/^([^\/]*)\/$/" मेरे लिए काम किया, जैसे सरणी से केवल शीर्ष "फ़ोल्डर" प्राप्त करने के लिए:

a/   <- this
a/b/
c/   <- this
c/d/
/d/e/
f/   <- this

2

वास्तव में थोड़े दुखी है कि किसी ने भी आपको सही जवाब नहीं दिया है ...।

रेगेक्स में,? यह गैर लालची बनाता है। डिफ़ॉल्ट रूप से जितना संभव हो उतना लालच मेल खाएगा (लालची)

बस एक जोड़ें? और यह गैर-लालची होगा और जितना संभव हो उतना कम मैच करेगा!

सौभाग्य, आशा है कि मदद करता है।


3
यह वास्तविक रेगेक्स कार्यान्वयन पर निर्भर करता है और प्रत्येक कार्यान्वयन में गैर-लालची मोड नहीं होता है।
कराटेग

0

मैने पाया कि

/^[^,]*,/

अच्छा काम करता है।

',' यहाँ "परिसीमन" होने के नाते।

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