घुंघराले ब्रेसिज़ के बीच स्ट्रिंग पाने के लिए रेगेक्स


115

दुर्भाग्य से, वर्ष में कम से कम एक बार रेगेक्स सीखने की कोशिश करने के बावजूद जितने वर्षों तक मैं याद रख सकता हूं, मैं हमेशा भूल जाता हूं क्योंकि मैं उन्हें इतनी बार उपयोग करता हूं। इस साल मेरे नए साल का संकल्प है कि दोबारा कोशिश न करें और रीजेक्स सीखें - इसलिए इस साल मुझे आँसू से बचाने के लिए मैं इसे स्टैक ओवरफ्लो में दूंगा । (अंतिम क्रिसमस रीमिक्स)।

मैं इस प्रारूप में एक स्ट्रिंग में पास होना चाहता हूं {getThis}, और स्ट्रिंग वापस कर दिया जाना चाहिए getThis। किसी को भी मेरे नए साल के संकल्प के लिए मदद करने में मदद कर सकता है?


स्टैक ओवरफ्लो पर संबंधित प्रश्न:


5
इस प्रश्न को "उन्नत रेगेक्स-फू" के तहत स्टैक ओवरफ्लो रेगुलर एक्सप्रेशन एफएक्यू में जोड़ा गया है ।
aliteralmind

@ कोबी: एफएक्यू एक विकी है। इसे कोई भी एडिट कर सकता है। तो इसे संपादित करें।
aliteralmind

जवाबों:


44

यदि आपकी स्ट्रिंग हमेशा उस प्रारूप की होगी, तो एक रेग्ज ओवरकल होता है:

>>> var g='{getThis}';
>>> g.substring(1,g.length-1)
"getThis"

substring(1में एक चरित्र शुरू करने का मतलब है (बस पहले से अतीत {) और ,g.length-1)स्ट्रिंग लंबाई शून्य से एक पर चरित्र (लेकिन शामिल नहीं) तक पात्रों को लेने का मतलब है। यह काम करता है क्योंकि स्थिति शून्य-आधारित है, अर्थात g.length-1अंतिम स्थिति।

मूल पोस्टर के अलावा अन्य पाठकों के लिए: यदि यह है एक regex, उपयोग होने के लिए /{([^}]*)}/, यदि आप रिक्त स्ट्रिंग अनुमति देना चाहते हैं या /{([^}]+)}/आप केवल मिलान करना चाहते हैं जब वहाँ घुंघराले ब्रेसिज़ के बीच कम से कम एक चरित्र है। टूट - फूट:

  • /: रेगेक्स पैटर्न शुरू करें
    • {: एक शाब्दिक घुंघराले ब्रेस
      • (: कब्जा करना शुरू करें
        • [: कब्जा करने के लिए वर्णों के एक वर्ग को परिभाषित करना शुरू करें
          • ^}: "इसके अलावा कुछ भी }"
        • ]: ठीक है, यह हमारी पूरी कक्षा की परिभाषा है
        • *: उस वर्ग से मेल खाने वाले वर्णों की कोई भी संख्या जो हमने अभी परिभाषित की है
      • ): कब्जा कर लिया
    • }: एक शाब्दिक घुंघराले ब्रेस का तुरंत पालन करना चाहिए जो हमने कब्जा किया था
  • /: रेगेक्स पैटर्न को समाप्त करें

7
सबस्ट्रिंग उन चीजों में से एक है जो आपके द्वारा काम करने वाली भाषा के आधार पर बदलती हैं। जावास्क्रिप्ट को बंद करने के लिए इंडेक्स लेता है, पीएचपी वांछित अंतिम परिणाम की लंबाई लेता है (जब तक कि यह नकारात्मक नहीं है, उस स्थिति में इसे हटाने के लिए वर्णों की संख्या लेता है) , सी # फिर से अलग है ... अच्छा और भ्रामक।
jvenema

2
... और पायथन में सिर्फ स्लाइसिंग होती है, जो IMO किसी भी चीज़ से बेहतर है: पी।
पॉल

27
मीठा, लेकिन यकीन नहीं है कि यह एक नियमित अभिव्यक्ति कैसे है। शायद वह regex के लिए पूछ रहा था, और मैं यहाँ एक ही जवाब के लिए आया था .. दुख की बात है कि इस सवाल का कोई लेना-देना नहीं है ..
baash05

5
@ baash05, यदि आप पूरे प्रश्न को पढ़ते हैं, तो ओपी रेगेक्स सीखना भी नहीं चाहता था, इसलिए मुझे नहीं लगता कि यह अकादमिक अभ्यास है जो आपको लगता है कि यह सुझाव दे रहा है।
केव

2
मुझे क्या करना -1 क्योंकि प्रश्न के लिए पूछ रहा है चाहता था regex , मैं खोज रहा था regex , लेकिन उसे स्वीकार जवाब मेरे लिए पूरी तरह से बेकार था (जबकि प्रश्न बहुत ही वादा कर लग रहा था)। पहली टिप्पणी पढ़ने के बाद मुझे यह स्वीकार करना चाहिए कि अगर मैं इस प्रश्न का उत्तर पहले देता तो मैं उसी / समान तरीके से उत्तर दे सकता था ... इसलिए अंत में, +1।
shadyyx

250

प्रयत्न

/{(.*?)}/

इसका मतलब है, {और} के बीच किसी भी वर्ण से मेल खाते हैं, लेकिन लालची नहीं हैं - सबसे छोटी स्ट्रिंग से मेल खाते हैं जो} ((बंद हो जाता है * लालची)) के साथ समाप्त होता है। कोष्ठक आपको मिलान वाले हिस्से को निकालने देता है।

एक और तरीका होगा

/{([^}]*)}/

यह किसी भी वर्ण से मेल खाता है सिवाय एक} चार (लालची नहीं होने का दूसरा तरीका)


यह उत्कृष्ट है, लेकिन क्या कर्ली-ब्रैकेट-संयोजनों की एक चर संख्या के बीच कुछ भी मेल करना संभव है? जैसे: "{यह मिलान किया जाना चाहिए} यह नहीं होना चाहिए {यह थोड़े फिर से होना चाहिए} और इसलिए {ऑन}"? मैं मान प्राप्त करना चाहूंगा, जो घुंघराले कोष्ठक के भीतर नहीं है। इसके अलावा: वाक्य में घुंघराले ब्रैकेट का उपयोग नहीं किया जाएगा और कोई स्टैकिंग नहीं है (यह कभी नहीं होगा: "{कुछ {टेक्स्ट}}")। किसी को भी यह कैसे करना है एक विचार :)? धन्यवाद! (पीएस: इस समाधान को उकेरा गया है)
इगोर

4
यह घुंघराले कोष्ठक के बीच सब कुछ कैप्चर नहीं करता है, यह घुंघराले कोष्ठक और घुंघराले कोष्ठक के बीच सब कुछ पकड़ लेता है। आप घुंघराले कोष्ठक के अंदर क्या है केवल कैप्चरिंग के बारे में कैसे जाएंगे?
रियलिटी-टॉरेंट

1
मुझे यह पसंद है कि आपको यहां घुंघराले ब्रेसिज़ से बचने की ज़रूरत नहीं है क्योंकि रेगेक्स पार्सर को यह महसूस होता है कि वे एक क्वांटिफायर नहीं हैं ... ठीक है, मैं अजगर में ऐसा कर रहा हूं, लेकिन मैं जावास्क्रिप्ट रीप्क्स की तरह काम करता हूं भी
drevicko

3
gअंत में जोड़ना इसे एक वैश्विक खोज बनाता है। एक कार्यशील उदाहरण
बेंजामिन

1
@ रियलिटी-टोरेंट, मैंने यह भी देखा कि अगर मैं सभी मैच पाने के लिए जी विकल्प को निर्दिष्ट करता हूं तो यह घुंघराले कोष्ठक पर कब्जा कर लेता है। पता चलता है कि मुझे जावास्क्रिप्ट में स्ट्रिंग.मैच के बजाय लूप में Regex.exec का उपयोग करना चाहिए, जिसमें दोनों जी ध्वज होगा, और कैप्चर समूह के लिए अनुमति होगी। Developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
frank

150
/\{([^}]+)\}/

/        - delimiter
\{       - opening literal brace escaped because it is a special character used for quantifiers eg {2,3}
(        - start capturing
[^}]     - character class consisting of
    ^    - not
    }    - a closing brace (no escaping necessary because special characters in a character class are different)
+        - one or more of the character class
)        - end capturing
\}       - the closing literal brace
/        - delimiter

@meouw sa = s.split ("/ \ {([^}] +) \} /"); एक संकलन त्रुटि देता है। अवैध पुनरावृत्ति, अवैध एस्केप चरित्र।
लाइकजूडो

@ एक नियमित अभिव्यक्ति के बजाय आप अपने विभाजन तर्क के रूप में एक स्ट्रिंग का उपयोग करते हुए दिखाई देते हैं। तुम क्या करने की कोशिश कर रहे हो?
22

30

इसे इस्तेमाल करे:

/[^{\}]+(?=})/g

उदाहरण के लिए

Welcome to RegExr v2.1 by #{gskinner.com},  #{ssd.sd} hosted by Media Temple!

वापस आ जाएगी gskinner.com, ssd.sd


1
महान, क्या आप बता सकते हैं कि आप \}पहले ब्लॉक में क्यों उपयोग करते हैं ?
उजैर अली

1
एक अच्छा है, लेकिन यह किसी भी समूह के साथ मेल खाता है }, भले ही इसके साथ शुरू न हो {
अहमद इब्राहिम

1
यह एकमात्र सही उत्तर है जो वास्तव में काम करता है।
pldg

स्पष्टीकरण: जबकि [^ \ {\}] + किसी भी चीज़ से मेल खाएगा जो एक घुंघराले ब्रेस नहीं है, लुकहेड अभिकथन (! =}) केवल कर्ल ब्रेस से पहले गुजरने वाले वर्गों को सुनिश्चित करेगा। / ... / g के साथ हम सभी घटनाएँ प्राप्त करते हैं, केवल पहले वाले ही नहीं।
0 -_- 0

19

यहाँ जावास्क्रिप्ट प्रतिस्थापित का उपयोग कर एक सरल समाधान है

var st = '{getThis}';

st = st.replace(/\{|\}/gi,''); // "getThis"

जैसा कि ऊपर दिए गए उत्तर में बताया गया है कि मूल समस्या आसानी से विकल्प के साथ हल हो जाती है, लेकिन प्रतिस्थापन का उपयोग करके अधिक जटिल उपयोग मामलों को हल किया जा सकता है

यदि आपके पास "randomstring999 [fieldname]" जैसा एक स्ट्रिंग है, तो आप फ़ील्डनाम प्राप्त करने के लिए थोड़ा अलग पैटर्न का उपयोग करते हैं

var nameAttr = "randomstring999[fieldname]";

var justName = nameAttr.replace(/.*\[|\]/gi,''); // "fieldname"

15

यह टेक्स्टमेट में काम करता है और यह घुंघराले कोष्ठक के बीच सीएसएस फ़ाइल में सब कुछ मेल खाता है।

\{(\s*?.*?)*?\}

selector {. . matches here including white space. . .}

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

\{((\s*?.*?)*?)\}

और आप $ 1 के माध्यम से सामग्री का उपयोग कर सकते हैं।

यह फ़ंक्शंस के लिए भी काम करता है, लेकिन मैंने इसे नेस्टेड कर्ली ब्रैकेट्स के साथ टेस्ट नहीं किया है।


14

आप regex lookahead और lookbehind का उपयोग करना चाहते हैं। यह आपको केवल वही देगा जो घुंघराले ब्रेस के अंदर है:

(?<=\{)(.*?)(?=\})

ऊपर घुंघराले ब्रेस से बचने के लिए एक बैकस्लैश होना चाहिए। वे मेरे सबमिशन में छीन लिए गए।
रॉबर्ट सिजेरिक

1
धन्यवाद, इससे आज मुझे मदद मिली।
व्यावसायिक

इस विधि का कोई नुकसान?
सोमाटिक

5
@ सोमाटिक- हाँ, नकारात्मक रूप और पीछे ECMAScript का समर्थन नहीं किया जाता है।
रॉबिन

नोट: यह उदाहरण जावा में काम करता है। सभी घुंघराले ब्रेसिज़ में सभी मान लौटाता है।
मल्टीप्लेक्स

13

इसे इस्तेमाल करे

let path = "/{id}/{name}/{age}";
const paramsPattern = /[^{\}]+(?=})/g;
let extractParams = path.match(paramsPattern);
console.log("extractParams", extractParams) // prints all the names between {} = ["id", "name", "age"]

1
वास्तव में मैं जो चाहता था :) यह बिना ब्रेसिज़ के परिणाम देगा, अन्य समाधान इसके साथ वापस आ
जाएंगे

बहुत बढ़िया, यहाँ सबसे अच्छा जवाब।
michal.jakubeczy

4

घुंघराले ब्रेसिज़ के साथ स्ट्रिंग के सरणियों को प्राप्त करने के लिए रेग्क्स स्ट्रिंग में होता है, बजाय केवल पहली घटना को खोजने के।

 /\{([^}]+)\}/gm 

4

मैंने अन्य उत्तरों पर ध्यान दिया है, और एक महत्वपूर्ण तर्क उन्हें याद आ रहा है। यानी, दो कंसर्टिव ब्रैकेट के बीच सब कुछ चुनें, लेकिन कोष्ठक नहीं

तो, यहाँ मेरा जवाब है

\{([^{}]+)\}

3
var re = /{(.*)}/;
var m = "{helloworld}".match(re);
if (m != null)
    console.log(m[0].replace(re, '$1'));

.replace(/.*{(.*)}.*/, '$1')अगर रीगेक्स मैच नहीं करता है तो सरलता दुर्भाग्य से पूरे स्ट्रिंग को वापस कर देती है। उपरोक्त कोड स्निपेट अधिक आसानी से एक मैच का पता लगा सकता है।



2

आप इस रेगेक्स पुनरावर्तन का उपयोग प्रत्येक के बीच मिलान करने के लिए कर सकते हैं, यहां तक ​​कि एक और {}(जैसे JSON पाठ):

\{([^()]|())*\}

अच्छा है, लेकिन यह केवल नेस्टेड ब्रेस के अंदर की सामग्री को कैप्चर करता है
डोमिनिक

यदि सामग्री शामिल है तो कब्जा नहीं करता है ()
मर्ट मर्ट्स

1

यहां तक ​​कि इससे मुझे किसी की समस्या को हल करने की कोशिश में मदद मिलती है,

घुंघराले ब्रेसिज़ ( {}) जैसी सामग्री को विभाजित करें , जैसे पैटर्न {'day': 1, 'count': 100}

उदाहरण के लिए:

#include <iostream> 
#include <regex> 
#include<string> 
using namespace std; 

int main() 
{ 
    //string to be searched
    string s = "{'day': 1, 'count': 100}, {'day': 2, 'count': 100}";

    // regex expression for pattern to be searched 
    regex e ("\\{[a-z':, 0-9]+\\}");
    regex_token_iterator<string::iterator> rend;

    regex_token_iterator<string::iterator> a ( s.begin(), s.end(), e );
    while (a!=rend) cout << " [" << *a++ << "]";
    cout << endl;

    return 0; 
}

आउटपुट:

[{'day': 1, 'count': 100}] [{'day': 2, 'count': 100}]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.