वर्ग कोष्ठक के बीच पाठ निकालने के लिए नियमित अभिव्यक्ति


411

सरल रेगेक्स प्रश्न। मेरे पास निम्नलिखित प्रारूप पर एक स्ट्रिंग है:

this is a [sample] string with [some] special words. [another one]

वर्ग कोष्ठक के भीतर शब्दों को निकालने के लिए नियमित अभिव्यक्ति क्या है, अर्थात।

sample
some
another one

नोट: मेरे उपयोग के मामले में, कोष्ठक नेस्टेड नहीं किया जा सकता है।

जवाबों:


765

आप विश्व स्तर पर निम्नलिखित regex का उपयोग कर सकते हैं :

\[(.*?)\]

स्पष्टीकरण:

  • \[: [एक मेटा चार है और यदि आप इसे शाब्दिक रूप से मेल खाना चाहते हैं तो बच निकलने की जरूरत है।
  • (.*?) : सब कुछ एक गैर-लालची तरीके से मिलान करें और इसे कैप्चर करें।
  • \]: ]एक मेटा चार है और यदि आप इसे शाब्दिक रूप से मेल खाना चाहते हैं तो बच निकलने की जरूरत है।

9
[^]]गैर-लालची ( ?) की तुलना में अन्य उत्तर की विधि का उपयोग तेजी से होता है , और रेगेक्स फ्लेवर के साथ भी काम करता है जो गैर-लालची का समर्थन नहीं करते हैं। हालांकि, गैर-लालची अच्छे दिखते हैं।
Ipsquiggle

183
[ ]आउटपुट (परिणाम) से कैसे बाहर रखा जाए ?
मिकी टिन

9
@ मिक्कीटाइन, यदि आप जावा का उपयोग कर रहे हैं, तो आप इसे समूह (1) को सिर्फ समूह () से अधिक का उपयोग करके समूह बना सकते हैं, इसलिए '[]' एक साथ नहीं
चलेगा

21
यह केवल पहली घटना से मेल खाता है
hfatahi

9
आप कोष्ठक को वापसी से बाहर कैसे करते हैं?
jzadra

119
(?<=\[).+?(?=\])

कोष्ठक के बिना सामग्री पर कब्जा करेगा

  • (?<=\[) - के लिए सकारात्मक तलाश [

  • .*? - गैर लालची सामग्री के लिए मैच

  • (?=\]) - के लिए सकारात्मक लुकहेड ]

संपादित करें: नेस्टेड कोष्ठक के लिए नीचे रेगेक्स को काम करना चाहिए:

(\[(?:\[??[^\[]*?\]))

3
@igaurav मैंने इसे जाँच लिया है और यह काम करता है। हालाँकि यह उन वातावरणों में काम नहीं करेगा जो जावास्क्रिप्ट की तरह लुकबाइंड का समर्थन नहीं करते हैं। शायद यह तुम्हारा मामला है?
एडम मोस्ज़स्की

एडम, आपका नेस्टेड ब्रैकेट्स समाधान तब विफल हो जाता है जब एक स्ट्रिंग एक के साथ होती है . उस में ...
पैट्रिक

89

यह ठीक काम करना चाहिए:

\[([^]]+)\]

5
मेरे उपयोग के मामले में, ब्रैकेट किए गए पाठ में नई लाइनें शामिल हो सकती हैं, और यह रेगेक्स काम करता है, जबकि स्वीकृत उत्तर नहीं देता है।
डेव

1
चरित्र वर्ग [^]] का क्या अर्थ है? क्या मेल खाता है?
रिचर्ड

3
@ रिचर्ड, द ^ चरित्र वर्ग को नकारते हैं। इसका अर्थ है "कोई भी चरित्र जो एक] नहीं है"।
जेसनबार

8
मुझे लगता है कि यह अपेक्षा के अनुरूप काम नहीं करता है, आपको \[([^\[\]]*)\]सबसे आंतरिक ब्रैकेट में सामग्री प्राप्त करने के लिए उपयोग करना चाहिए । यदि आप देखते हैं lfjlksd [ded[ee]22]तो प्रस्तावित अभिव्यक्ति वापस आने के दौरान \[([^]]+)\]आपको मिल [ded[ee]जाएगी [ee]लिंक
TMC

1
क्या आप इस regex का उपयोग करने और पाठ को निकालने के लिए 'sed' और 'awk' उदाहरण प्रदान कर सकते हैं। धन्यवाद।
वेलेंटाइन

32

क्या कोष्ठक नेस्टेड किया जा सकता है?

यदि नहीं: \[([^]]+)\]वर्ग कोष्ठक सहित एक आइटम से मेल खाता है। Backreference \1में आइटम मिलान करने के लिए होगा। यदि आपका regex स्वाद लुकअप का समर्थन करता है, तो उपयोग करें

(?<=\[)[^]]+(?=\])

यह केवल ब्रैकेट के अंदर आइटम से मेल खाएगा।


@KunalMukherjee: नहीं, रेगेक्स कई बार मेल कर सकता है। लेकिन कुछ रेगेक्स फ्लेवर्स को रेगेक्स को बार-बार लागू करने के लिए स्पष्ट रूप से बताया जाना चाहिए (उदाहरण के लिए, /gजावास्क्रिप्ट में ध्वज का उपयोग करके )।
15

14

यदि आप कोष्ठक को मैच में शामिल नहीं करना चाहते हैं, तो यहां regex: (?<=\[).*?(?=\])

चलो इसे तोड़ दो

.लाइन टर्मिनेटर्स के अलावा कोई भी चरित्र से मेल खाता है। ?=एक है सकारात्मक अग्रदर्शी । एक सकारात्मक लुकहेड एक स्ट्रिंग पाता है जब एक निश्चित स्ट्रिंग इसके बाद आती है। ?<=एक है सकारात्मक lookbehind । एक सकारात्मक लुकबाइंड एक स्ट्रिंग को ढूंढता है जब एक निश्चित स्ट्रिंग इसे पूर्व करती है। इसे उद्धृत करने के लिए ,

आगे देखें सकारात्मक (? =)

अभिव्यक्ति का पता लगाएं, जहां अभिव्यक्ति B इस प्रकार है:

A(?=B)

सकारात्मक के पीछे देखो! (<=)

अभिव्यक्ति का पता लगाएं, जहां अभिव्यक्ति B पूर्व:

(?<=B)A

वैकल्पिक

यदि आपका रेगेक्स इंजन लुकहैड्स और लुकबाइंड्स का समर्थन नहीं करता है, तो आप \[(.*?)\]एक समूह में ब्रैकेट्स के अंतर को पकड़ने के लिए रेगेक्स का उपयोग कर सकते हैं और फिर आप समूह को आवश्यकतानुसार जोड़ तोड़ कर सकते हैं।

यह रेगेक्स कैसे काम करता है?

कोष्ठक एक समूह में वर्णों को पकड़ते हैं। .*?कोष्ठक के बीच के सभी वर्ण हो जाता है (जब तक आप है, लाइन टर्मिनेटर्स के अलावा sएक तरीका है कि लालची नहीं है में ध्वज सक्षम)।


12

(?<=\[).*?(?=\])ऊपर दिए गए स्पष्टीकरण के अनुसार अच्छा काम करता है। यहाँ एक पायथन उदाहरण है:

import re 
str = "Pagination.go('formPagination_bottom',2,'Page',true,'1',null,'2013')"
re.search('(?<=\[).*?(?=\])', str).group()
"'formPagination_bottom',2,'Page',true,'1',null,'2013'"

1
आपको हमेशा regexes के लिए कोड स्वरूपण का उपयोग करना चाहिए, चाहे वे कहीं भी दिखाई दें। यदि रेगेक्स एक कोड ब्लॉक के बजाय पाठ में है, तो आप उन्हें प्रारूपित करने के लिए बैकटिक्स का उपयोग कर सकते हैं। ( रेफ )
एलन मूर

1
इसके अलावा, प्रश्न वर्ग कोष्ठक ( []) के बारे में था , कोष्ठक नहीं।
एलन मूर

6

बस के मामले में, आपके पास असंतुलित कोष्ठक हो सकते हैं , आप संभवतः पुनरावृत्ति के साथ कुछ अभिव्यक्ति को डिजाइन कर सकते हैं,

\[(([^\]\[]+)|(?R))*+\]

जो निश्चित रूप से, यह भाषा या RegEx इंजन से संबंधित होगा जिसे आप उपयोग कर रहे हैं।

RegEx डेमो 1


उसके अलावा,

\[([^\]\[\r\n]*)\]

RegEx डेमो 2

या,

(?<=\[)[^\]\[\r\n]*(?=\])

RegEx डेमो 3

तलाशने के लिए अच्छे विकल्प हैं।


यदि आप अभिव्यक्ति को सरल / संशोधित / एक्सप्लोर करना चाहते हैं, तो इसे regex101.com के ऊपरी दाएँ पैनल पर समझाया गया है । यदि आप चाहें, तो आप इस लिंक में भी देख सकते हैं कि यह कुछ नमूना आदानों के साथ कैसे मेल खाता है।


RegEx सर्किट

jex.im नियमित अभिव्यक्ति की कल्पना करता है:

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

परीक्षा

const regex = /\[([^\]\[\r\n]*)\]/gm;
const str = `This is a [sample] string with [some] special words. [another one]
This is a [sample string with [some special words. [another one
This is a [sample[sample]] string with [[some][some]] special words. [[another one]]`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

स्रोत

संतुलित कोष्ठकों से मेल खाने की नियमित अभिव्यक्ति


4

यदि आप वर्गाकार कोष्ठक az के बीच केवल छोटे वर्णमाला अक्षर भरना चाहते हैं

(\[[a-z]*\])

यदि आप छोटे और कैप पत्र ए-जेडए-जेड चाहते हैं

(\[[a-zA-Z]*\]) 

यदि आप छोटे कैप और नंबर अक्षर a-zA-Z0-9 चाहते हैं

(\[[a-zA-Z0-9]*\]) 

यदि आप वर्ग ब्रैकेट के बीच सब कुछ चाहते हैं

यदि आप पाठ, संख्या और प्रतीक चाहते हैं

(\[.*\])

3
([[][a-z \s]+[]])

ऊपर दिए गए स्पष्टीकरण को देखते हुए काम करना चाहिए

  • वर्गाकार कोष्ठकों के भीतर के वर्ण [] कोरे वर्ग को परिभाषित करते हैं जिसका अर्थ है कि प्रतिरूप को चौकोर कोष्ठक के भीतर वर्णित एक वर्णक से मेल खाना चाहिए

  • एक स्थान निर्दिष्ट करता है

  •  + का मतलब कम से कम पहले से उल्लेखित चरित्र में से एक है।


संवेदनशील मामलों में A-Zपैटर्न को जोड़ना चाहिए ([[][a-zA-Z \s]+[]]):; मुझे लगता है कि यह अच्छा तरीका है, जबकि \ रेगेक्स पैटर्न में जो स्ट्रिंग के निशान ("और ') में परिभाषित होता है और" या' usages में बैकस्लैश हैंडलिंग के द्वारा नए-नए मिश्रण करता है!
मोहम्मड़

एकमात्र जवाब जो मेरे लिए C ++ regex के लिए काम करता है (कोष्ठक के बजाय उद्धरण के साथ कर रहा है) को छोड़कर। std::regex pattern{R"(["][a-zA-Z \s]+["])"};
स्टैकअटैक

3

यह कोड चौकोर कोष्ठक और लघुकोष्ठक के बीच की सामग्री को निकालेगा

(?:(?<=\().+?(?=\))|(?<=\[).+?(?=\]))

(?: non capturing group
(?<=\().+?(?=\)) positive lookbehind and lookahead to extract the text between parentheses
| or
(?<=\[).+?(?=\]) positive lookbehind and lookahead to extract the text between square brackets


0

मुझे नए सिरे से और कोष्ठक सहित आवश्यक था

\[[\s\S]+\]


0

पहले और अंतिम के बीच [ ] एक विकल्प का मिलान करने के लिए , आप उपयोग कर सकते हैं

\[.*\]            # Including open/close brackets
\[(.*)\]          # Excluding open/close brackets (using a capturing group)
(?<=\[).*(?=\])   # Excluding open/close brackets (using lookarounds)

एक रेगीक्स डेमो और एक रेगेक्स डेमो # 2 देखें

निकटतम वर्ग कोष्ठक के बीच तार का मिलान करने के लिए निम्नलिखित भावों का उपयोग करें :

  • कोष्ठक सहित:

    • \[[^][]*]- पीसीआरई, पायथन re/ regex, .NET, गोलंग, पोसिक्स (ग्रीप, सेड, बैश)
    • \[[^\][]*]- ECMAScript (जावास्क्रिप्ट, C ++ std::regex, VBA RegExp)
    • \[[^\]\[]*] - जावा रेगेक्स
    • \[[^\]\[]*\] - ओनिग्मो (रूबी, हर जगह कोष्ठक से बचने की आवश्यकता है)
  • कोष्ठक को छोड़कर:

    • (?<=\[)[^][]*(?=])- पीसीआरई, पायथन re/ regex, .NET (C #, आदि), ICU (R stringr), JGSoft सॉफ्टवेयर
    • \[([^][]*)]- बैश , गोलंग - बिना किसी कोष्ठक के जोड़े के साथ वर्ग कोष्ठक के बीच की सामग्री को कैप्चर करें, नीचे भी देखें
    • \[([^\][]*)]- जावास्क्रिप्ट , सी ++std::regex , वीबीएRegExp
    • (?<=\[)[^\]\[]*(?=]) - जावा रेगेक्स
    • (?<=\[)[^\]\[]*(?=\]) - ओनिग्मो (रूबी, हर जगह कोष्ठक से बचने की आवश्यकता है)

नोट : *0 या अधिक वर्णों से मेल खाता है, उपयोग करें+ से मेल खाता है, परिणामी सूची / सरणी में खाली स्ट्रिंग मिलान से बचने के लिए 1 या अधिक से मेल खाने के लिए करें।

जब भी दोनों लुकअप समर्थन उपलब्ध होते हैं, तो उपरोक्त समाधान अग्रणी / अनुगामी ओपन / क्लोज ब्रैकेट को बाहर करने के लिए उन पर भरोसा करते हैं। अन्यथा, कैप्चरिंग समूहों (कुछ भाषाओं में सबसे आम समाधानों के लिंक प्रदान किए गए हैं) पर भरोसा करें।

यदि आपको नेस्टेड कोष्ठक से मेल खाने की आवश्यकता है , तो आप संतुलित कोष्ठक के धागे से मेल खाने के लिए रेगुलर एक्सप्रेशन में समाधान देख सकते हैं और आवश्यक कार्यक्षमता प्राप्त करने के लिए गोल कोष्ठकों को स्क्वायर लोगों के साथ बदल सकते हैं। आपको खुली / बंद ब्रैकेट वाली सामग्री को बाहर करने के लिए कैप्चरिंग समूहों का उपयोग करना चाहिए:

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