नियमित रूप से अभिव्यक्ति एक स्ट्रिंग को खोजने के लिए दो पात्रों के बीच शामिल है जबकि सीमांकक को बाहर निकालना


294

मुझे एक स्ट्रिंग से पात्रों का एक सेट निकालने की ज़रूरत है जो दो सीमांकक के बीच शामिल हैं, बिना खुद सीमांकक वापस लौटते हैं।

एक सरल उदाहरण सहायक होना चाहिए:

लक्ष्य : चौकोर कोष्ठक के बीच सबस्ट्रिंग निकालें, बिना कोष्ठक को वापस किए।

आधार स्ट्रिंग :This is a test string [more or less]

अगर मैं निम्नलिखित reg का उपयोग करता हूं। पूर्व।

\ [। *? \]

मैच है [more or less]। मुझे केवल more or less(कोष्ठक के बिना) प्राप्त करने की आवश्यकता है ।

क्या ऐसा करना संभव है?


जवाबों:


453

आसान काम:

(?<=\[)(.*?)(?=\])

तकनीकी तौर पर यह लुकहेड्स और लुकबाइंड्स का उपयोग कर रहा है। लुकहेड और लुकबाइंड देखें शून्य-चौड़ाई के दावे । पैटर्न में शामिल हैं:

  • एक [कि कब्जा नहीं किया गया है] से पहले है;
  • एक गैर-लालची कब्जा समूह। पहले पर रोकना गैर-लालची है]; तथा
  • इसके बाद ए] को पकड़ लिया जाता है (लुकहेड)।

वैकल्पिक रूप से आप बस वर्गाकार कोष्ठक के बीच क्या है, इसे पकड़ सकते हैं:

\[(.*?)\]

और पूरे मैच के बजाय पहले कैप्चर किए गए समूह को लौटाएं।


138
"आराम से किया", LOL! :) नियमित अभिव्यक्तियाँ मुझे हमेशा सिरदर्द देती हैं, मैं उन्हें भूल जाता हूं जैसे ही मैं अपनी समस्याओं को हल करता हूं। आपके समाधान के बारे में: पहला काम उम्मीद के मुताबिक होता है, दूसरा नहीं करता है, यह कोष्ठक सहित रहता है। मैं C # का उपयोग कर रहा हूं, शायद RegEx ऑब्जेक्ट में रेगेक्स इंजन का अपना "स्वाद" है ...
डिएगो

5
ऐसा इसलिए कर रहे हैं क्योंकि आप पहले मिलान वाले समूह के बजाय पूरे मैच को देख रहे हैं।
cletus

बहुत धन्यवाद, बहुत उपयोगी वेबसाइट! मैं इसे एक संदर्भ के रूप में रखूँगा। :) क्षमा करें अगर मैंने कुछ भ्रम किया, तो सी # विकास वास्तव में मेरे कौशल में से एक नहीं है ..
डिएगो

1
क्या यह काम करता है अगर सबस्ट्रिंग में सीमांकक भी होता है? उदाहरण के लिए This is a test string [more [or] less]क्या यह वापसी करेगा more [or] less?
gnzlbg

1
@gnzlbg नहीं, यह "अधिक [या"
लौटेगा

52

यदि आप जावास्क्रिप्ट का उपयोग कर रहे हैं , तो cletus द्वारा प्रदान किया गया पहला समाधान , (?<=\[)(.*?)(?=\])काम नहीं करेगा क्योंकि जावास्क्रिप्ट लुकअप ऑपरेटर का समर्थन नहीं करता है।

हालांकि, दूसरा समाधान अच्छी तरह से काम करता है, लेकिन आपको दूसरा मिलान तत्व प्राप्त करने की आवश्यकता है।

उदाहरण:

var regex = /\[(.*?)\]/;
var strToMatch = "This is a test string [more or less]";
var matched = regex.exec(strToMatch);

यह लौटेगा:

["[more or less]", "more or less"]

तो, आपको जो चाहिए वह दूसरा मूल्य है। उपयोग:

var matched = regex.exec(strToMatch)[1];

वापस देना:

"more or less"

2
क्या होगा अगर स्ट्रिंग में [अधिक या कम] के कई मैच हैं?


19

आपको बस कोष्ठक के बीच के हिस्से को 'कैप्चर' करना होगा।

\[(.*?)\]

कैप्चर करने के लिए आप इसे कोष्ठक के अंदर रखें। आप यह नहीं कहते कि यह किस भाषा का उपयोग कर रहा है। उदाहरण के लिए पर्ल में, आप $ 1 चर का उपयोग करके इसे एक्सेस करेंगे।

my $string ='This is the match [more or less]';
$string =~ /\[(.*?)\]/;
print "match:$1\n";

अन्य भाषाओं में अलग-अलग तंत्र होंगे। उदाहरण के लिए, C #, संग्रह संग्रह वर्ग का उपयोग करता है , मुझे विश्वास है।


धन्यवाद, लेकिन यह समाधान काम नहीं किया, यह वर्ग कोष्ठक सहित रहता है। जैसा कि मैंने Cletus के समाधान में अपनी टिप्पणी में लिखा है, यह हो सकता है कि C # RegEx ऑब्जेक्ट इसे अलग तरीके से व्याख्या करता है। मैं सी # पर विशेषज्ञ नहीं हूं, लेकिन यह सिर्फ एक अनुमान है, शायद यह सिर्फ मेरे ज्ञान की कमी है। :)
डिएगो

11

[^\[] किसी भी चरित्र से मेल खाता है जो [नहीं है।

+जो कुछ भी नहीं है उससे 1 या अधिक मिलान करें [। इन मैचों के समूह बनाता है।

(?=\])पॉजिटिव लुकहेड ]]परिणाम में इसे शामिल किए बिना एक समूह को समाप्त करता है।

किया हुआ।

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

सबूत।

http://regexr.com/3gobr

शून्य द्वारा प्रस्तावित समाधान के समान। लेकिन अतिरिक्त \]की आवश्यकता नहीं है। अतिरिक्त नोट के रूप में, ऐसा प्रतीत होता \है कि इसके [बाद भागने की आवश्यकता नहीं है^ । पठनीयता के लिए, मैं इसे छोड़ दूंगा।

उस स्थिति में काम नहीं करता है जिसमें सीमांकक समान हैं। "more or less"उदाहरण के लिए।


8

पीएचपी:

$string ='This is the match [more or less]';
preg_match('#\[(.*)\]#', $string, $match);
var_dump($match[1]);


3

मुझे बैश स्क्रिप्टिंग के साथ रेगेक्स का उपयोग करने में समान समस्या थी। मैंने grep -o लगाने के साथ पाइप का उपयोग करते हुए 2-चरण का समाधान किया

 '\[(.*?)\]'  

तब पहला

'\b.*\b'

स्पष्ट रूप से अन्य उत्तरों में उतना कुशल नहीं है, लेकिन एक विकल्प है।


3

यह विशेष रूप से जावास्क्रिप्ट की नियमित अभिव्यक्ति पार्सर के लिए काम करता है /[^[\]]+(?=])/g

बस इसे कंसोल में चलाएं

var regex = /[^[\]]+(?=])/g;
var str = "This is a test string [more or less]";
var match = regex.exec(str);
match;

2

मैं / और # के बीच एक स्ट्रिंग ढूंढना चाहता था, लेकिन # कभी-कभी वैकल्पिक होता है। यहाँ रेगेक्स I का उपयोग किया गया है:

  (?<=\/)([^#]+)(?=#*)

0

यहाँ मुझे C # में '[' और ']' के बिना मिला है:

        var text = "This is a test string [more or less]";
        //Getting only string between '[' and ']'
        Regex regex = new Regex(@"\[(.+?)\]");
        var matchGroups = regex.Matches(text);
        for (int i = 0; i < matchGroups.Count; i++)
        {
            Console.WriteLine(matchGroups[i].Groups[1]);
        }

आउटपुट है:

more or less

-1

यदि आपको कोष्ठक के बिना पाठ को निकालने की आवश्यकता है, तो आप बैश awk का उपयोग कर सकते हैं

echo " [hola mundo] " | awk -F'[][]' '{print $2}'

परिणाम:

hola mundo

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