एक नियमित अभिव्यक्ति में "वर्णों के इस क्रम तक कुछ भी" का मिलान कैसे करें?


514

यह नियमित अभिव्यक्ति लें /^[^abc]/:। यह स्ट्रिंग, आर, बी या सी को छोड़कर किसी भी एकल चरित्र से मेल खाएगा।

यदि आप *इसके बाद जोड़ते हैं - /^[^abc]*/- नियमित अभिव्यक्ति प्रत्येक बाद के चरित्र को परिणाम में जोड़ना जारी रखेगा, जब तक कि यह या तो ए a, या b , या से मिलता है c

उदाहरण के लिए, स्रोत स्ट्रिंग के साथ "qwerty qwerty whatever abc hello", अभिव्यक्ति मेल खाएगी "qwerty qwerty wh"

लेकिन क्या होगा अगर मैं मिलान स्ट्रिंग होना चाहता था "qwerty qwerty whatever "

... दूसरे शब्दों में, मैं सटीक क्रम में सब कुछ (लेकिन शामिल नहीं) तक कैसे मेल कर सकता हूं "abc"?


आपका क्या मतलब है match but not including?
पूर्ण

5
मेरा मतलब है कि मैं मैच करना चाहता हूं "qwerty qwerty whatever "- जिसमें "एबीसी" शामिल नहीं है। दूसरे शब्दों में, मैं नहीं चाहता कि परिणामी मैच होना चाहिए "qwerty qwerty whatever abc"
कैलम

2
जावास्क्रिप्ट में आप बस कर सकते हैं do string.split('abc')[0]। निश्चित रूप से इस समस्या का आधिकारिक जवाब नहीं है, लेकिन मुझे यह रेगेक्स की तुलना में अधिक सीधा लगता है।
व्यालियम जुड

जवाबों:


1020

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

/.+?(?=abc)/

यह काम किस प्रकार करता है

यह .+? हिस्सा .+ (किसी भी चीज़ का एक या अधिक) का लालची संस्करण है । जब हम उपयोग करते हैं .+, तो इंजन मूल रूप से सब कुछ से मेल खाएगा। फिर, अगर रेगेक्स में कुछ और है तो यह निम्नलिखित भाग से मेल खाने की कोशिश में वापस आ जाएगा। यह लालची व्यवहार है, जिसका अर्थ है जितना संभव हो उतना संतुष्ट करना

उपयोग करते समय .+?, सभी को एक साथ मिलान करने और अन्य स्थितियों (यदि कोई हो) के लिए वापस जाने के बजाय, इंजन अगले वर्णों का मिलान तब तक करेगा जब तक कि रेगेक्स के बाद के भाग का मिलान नहीं हो जाता (फिर से यदि कोई हो)। यह संयुक्त राष्ट्र का लालची है , जिसका अर्थ है संतुष्ट करने के लिए सबसे कम संभव मैच ।

/.+X/  ~ "abcXabcXabcX"        /.+/  ~ "abcXabcXabcX"
          ^^^^^^^^^^^^                  ^^^^^^^^^^^^

/.+?X/ ~ "abcXabcXabcX"        /.+?/ ~ "abcXabcXabcX"
          ^^^^                          ^

उसके बाद हमारे पास एक शून्य चौड़ाई का जोर है , चारों ओर एक नज़र । यह समूहीकृत निर्माण अपनी सामग्री से मेल खाता है, लेकिन मिलान किए गए वर्णों ( शून्य चौड़ाई ) के रूप में गणना नहीं करता है । यह केवल तभी लौटाता है जब यह एक मेल है या नहीं ( जोर )।(?={contents})

इस प्रकार, अन्य शब्दों में रेगेक्स का /.+?(?=abc)/अर्थ है:

"Abc" की गिनती के बिना, "abc" मिलने तक किसी भी वर्ण का मिलान करें।


12
यह संभवतः लाइन ब्रेक के साथ काम नहीं करेगा, अगर उन्हें कब्जा करना चाहिए।
13:16 बजे

3
बीच क्या अंतर है .+?और .*?
रॉबी

4
@ robbie0630 का +अर्थ 1 या अधिक है, जहां *0 या अधिक का अर्थ है। ?वसीयत का समावेश / बहिष्करण इसे लालची या गैर-लालची बना देगा।
जिंगलस्तूला

2
@ testerjoe2 /.+?(?=abc|xyz)/
JohnWrensby

4
मैंने देखा है कि यदि आपके द्वारा खोजा जाने वाला पैटर्न मौजूद नहीं है, तो यह कुछ भी चयन करने में विफल रहता है, इसके बजाय यदि आप जिस पैटर्न का उपयोग ^(?:(?!abc)(?!def).)*नहीं करना चाहते हैं उसे बाहर करने के लिए चेन का उपयोग कर सकते हैं और यह तब भी सबकुछ हड़प लेगा जब तक कि पैटर्न मौजूद न हो
करण शिशु

122

यदि आप "abc" तक सब कुछ कैप्चर करना चाहते हैं:

/^(.*?)abc/

स्पष्टीकरण:

( )का उपयोग कर पहुँच के लिए कोष्ठकों के अंदर अभिव्यक्ति पर कब्जा $1, $2आदि

^ मैच की शुरुआत रेखा

.*कुछ भी मैच करें, ?गैर-लालची (आवश्यक वर्णों की न्यूनतम संख्या का मिलान करें) - [1]

[१] इसका कारण यह है कि निम्नलिखित स्ट्रिंग में अन्यथा इसकी आवश्यकता है:

whatever whatever something abc something abc

डिफ़ॉल्ट रूप से, रेगीक्स लालची होते हैं , जिसका अर्थ है कि यह जितना संभव हो उतना मेल खाएगा। इसलिए /^.*abc/"जो कुछ भी एबीसी कुछ भी होगा" से मेल खाता था। गैर-लालची क्वांटिफायर को जोड़ने से ?रेगेक्स केवल "जो कुछ भी हो" से मेल खाता है।


4
धन्यवाद, लेकिन अपने एक करता मैच में एबीसी शामिल हैं। दूसरे शब्दों में परिणामी मैच "जो कुछ भी एबीसी है"।
कैलम

1
क्या आप समझा सकते हैं कि आप आखिर क्या करना चाह रहे हैं? यदि आपका परिदृश्य है: (ए) आप "एबीसी" के लिए अग्रणी सब कुछ प्राप्त करना चाहते हैं - बस जो आप कैप्चर करना चाहते हैं उसके चारों ओर कोष्ठक का उपयोग करें। (बी) आप स्ट्रिंग को "एबीसी" तक मेल खाना चाहते हैं - आपको एबीसी को वैसे भी जांचना होगा, इसलिए इसे परवाह किए बिना रेगेक्स का हिस्सा होना चाहिए। आप कैसे जांच सकते हैं कि यह वहां है?
जारेड Ng

sedगैर-लालची मिलान का समर्थन नहीं करता है, न ही यह लुक-अराउंड ( (?=...)) का समर्थन करता है । मैं और क्या कर सकता हुँ? उदाहरण कमांड: echo "ONE: two,three, FOUR FIVE, six,seven" | sed -n -r "s/^ONE: (.+?), .*/\1/p"रिटर्न two,three, FOUR FIVE, लेकिन मुझे उम्मीद है two,three...
CodeManX

1
@CoDEmanX आपको संभवतः टिप्पणी के बजाय अपने स्वयं के अलग प्रश्न के रूप में पोस्ट करना चाहिए, खासकर जब से यह विशेष रूप से sed के बारे में है। यह कहा जा रहा है, अपने प्रश्न को संबोधित करने के लिए: आप इस प्रश्न के उत्तर को देखना चाह सकते हैं । यह भी ध्यान दें कि आपके उदाहरण में, एक गैर-लालची जागरूक दुभाषिया बस वापस आ जाएगा two, नहीं two,three
जारेड एनजी

3
इस तरह से हर सवाल का जवाब देखना चाहिए - उदाहरण और सभी भागों की व्याख्या ...
jave.web

54

जैसा कि @Jared Ng और @Issun ने बताया, इस तरह के RegEx को हल करने की कुंजी जैसे "एक निश्चित शब्द तक सब कुछ मिलान करना या प्रतिस्थापित करना" या "एक निश्चित शब्द के बाद सब कुछ मिलान करना या प्रतिस्थापित करना" लुकअराउंड "शून्य-लंबाई सिद्धांत कहा जाता है" । उनके बारे में यहां और अधिक पढ़ें।

आपके विशेष मामले में, इसे आगे एक सकारात्मक नज़र से हल किया जा सकता है: .+?(?=abc)

एक तस्वीर एक हजार शब्दों के बराबर होती है। स्क्रीनशॉट में विस्तार से देखें।

Regex101 स्क्रीनशॉट


23
.+?(?=abc)कॉपी-पेस्टेबल रेगेक्स की कीमत अधिक है।
टॉम

प्रमुख स्थानों को छोड़कर क्या होगा?
रॉय

8

आप की जरूरत है क्या जोर की तरह चारों ओर देखो .+? (?=abc)

देखें: अग्रावलोकन और Lookbehind शून्य लंबाई दावे

ध्यान रखें कि [abc]ऐसा नहीं है abc। ब्रैकेट के अंदर यह एक स्ट्रिंग नहीं है - प्रत्येक चरित्र संभावनाओं में से एक है। ब्रैकेट के बाहर यह स्ट्रिंग बन जाता है।


7

जावा में रेगेक्स के लिए, और मेरा मानना ​​है कि अधिकांश रेगेक्स इंजनों में भी, यदि आप अंतिम भाग को शामिल करना चाहते हैं तो यह काम करेगा:

.+?(abc)

उदाहरण के लिए, इस पंक्ति में:

I have this very nice senabctence

"एबीसी" तक सभी पात्रों का चयन करें और एबीसी भी शामिल करें

हमारे regex का उपयोग कर, परिणाम होगा: I have this very nice senabc

इसका परीक्षण करें: https://regex101.com/r/mX51ru/1


4

मैं अपनी समस्या को हल करने के लिए मदद की तलाश में इस स्टैक्वेरफ़्लो प्रश्न पर समाप्त हो गया, लेकिन इसका कोई हल नहीं मिला :(

इसलिए मुझे सुधार करना पड़ा ... कुछ समय बाद मैं अपनी जरूरत के हिसाब से रेजगारी तक पहुंचने में कामयाब रहा:

यहाँ छवि विवरण दर्ज करें

जैसा कि आप देख सकते हैं, मुझे अंतिम डैश सहित बिना "जीआरपी-बीपीएस" फ़ोल्डर के आगे एक फ़ोल्डर तक की आवश्यकता थी। और "जीआरपी-बीपीएस" फ़ोल्डर के बाद कम से कम एक फ़ोल्डर होना आवश्यक था।

संपादित करें

कॉपी-पेस्ट के लिए पाठ संस्करण (अपने पाठ के लिए 'grp-bps' बदलें):

.*\/grp-bps\/[^\/]+

6
कोई पाठ संस्करण नहीं? Ot
कीरदोटी

2

यह रेगेक्स के बारे में समझ बनाएगा।

  1. सटीक शब्द निम्नलिखित regex कमांड से प्राप्त किया जा सकता है:

( "(। *?)") / जी

यहां, हम विश्व स्तर पर सटीक शब्द प्राप्त कर सकते हैं जो दोहरे उद्धरण चिह्नों के अंदर है। उदाहरण के लिए, यदि हमारा खोज पाठ है,

यह "दोहरे उद्धृत" शब्दों के लिए उदाहरण है

तब हमें उस वाक्य से "डबल उद्धृत" मिलेगा।


StackOverflow में आपका स्वागत है और मदद करने के आपके प्रयास के लिए धन्यवाद। मुझे यह देखना कठिन है कि यह प्रश्न में बताए गए लक्ष्य को कैसे मदद करता है। क्या आप विस्तार से समझा सकते हैं? क्या आप इसे दिए गए उदाहरणों पर लागू कर सकते हैं? आप से निपटने पर ध्यान केंद्रित करने के लिए लगता है ", जो मुझे सवाल के लिए अप्रासंगिक लगता है।
यूननोस

1
नमस्ते, मैंने समझाया है कि विशेष वर्णों के बीच शब्द या वाक्य कैसे प्राप्त करें। यहाँ हमारा प्रश्न भी "कुछ भी है जब तक कि विशेष वर्णों का क्रम नहीं है"। इसलिए मैंने दोहरे उद्धरण चिह्नों के साथ कोशिश की और इसे यहाँ समझाया। धन्यवाद।
पोनमुरुगन मोहनराज

2

अजगर पर:

.+?(?=abc) सिंगल लाइन केस के लिए काम करता है।

[^]+?(?=abc)काम नहीं करता है, क्योंकि अजगर मान्य रेगेक्स के रूप में [^] को नहीं पहचानता है। बहुस्तरीय मिलान कार्य करने के लिए, आपको उदाहरण के लिए re.DOTALL विकल्प का उपयोग करना होगा:

re.findall('.+?(?=abc)', data, re.DOTALL)

0

मेरा मानना ​​है कि आपको उपमेय की आवश्यकता है। अगर मुझे सही याद है तो आप ()सबटैक्स के लिए सामान्य कोष्ठक का उपयोग कर सकते हैं ।

यह भाग grep मैनुअल से है:

 Back References and Subexpressions
       The back-reference \n, where n is a single digit, matches the substring
       previously matched  by  the  nth  parenthesized  subexpression  of  the
       regular expression.

कुछ ^[^(abc)]ऐसा करें कि चाल चलनी चाहिए।


क्षमा करें, यह काम नहीं करता है। कोष्ठक में एबीसी डालने से कोई फर्क नहीं पड़ता। उन्हें अभी भी "ए या बी या सी" माना जाता है।
कैलम

-1

$अंक एक स्ट्रिंग के अंत है, तो कुछ इस तरह काम करना चाहिए: [[^abc]*]$जहां कुछ भी के किसी भी चरण में समाप्त नहीं की तलाश कर रहे abcहैं, लेकिन यह अंत में होना करने के लिए होता

यदि आप regex (जैसे php या js) के साथ एक स्क्रिप्टिंग भाषा का उपयोग कर रहे हैं, तो उनके पास एक खोज फ़ंक्शन है जो तब रुकता है जब यह पहली बार एक पैटर्न का सामना करता है (और आप बाईं ओर से शुरू कर सकते हैं या दाईं ओर से शुरू कर सकते हैं, या php के साथ, आप स्ट्रिंग को दर्पण करने के लिए एक प्रत्यारोपण कर सकते हैं)।


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