2009-10-12 4 views
25

मैं एक रेगेक्स पैटर्न की तलाश में हूं जो मुझे स्ट्रिंग में ब्रांड्स के पहले सेट की सामग्री लौटाएगा।रेगेक्स पैटर्न कोष्ठक के भीतर से पाठ वापस करने के लिए

उदाहरण के लिए

,

text text text text (hello) text (hello2) (hello3) text 

वापस आ जाएगी "hello"

किसी को भी पता है पैटर्न ग # के लिए कैसा दिखता है?

+1

शीर्षक परिवर्तन अनुरोध। 'ब्रैकेट' शब्द को '[' और नहीं '(' (कोष्ठक) के लिए इस्तेमाल नहीं किया जाना चाहिए? - क्रोकुसेक – crokusek

उत्तर

59

regexp पैटर्न कुछ इस तरह दिखेगा:

\(([^)]*)\) 

पैटर्न शव परीक्षा:

\( - एक शाब्दिक "("

( - subpattern की शुरुआत:

[^)]* मैच 0 या अधिक वर्ण जो ")" नहीं हैं - नोट: हम एक चरित्र समूह को परिभाषित कर रहे हैं, इसलिए हमें यहां ) वर्ण से बचने की आवश्यकता नहीं है।

) - subpattern के अंत

\) - एक शाब्दिक ")"

पूरा पैटर्न कोष्ठक और उन्हें अंदर पाठ से मेल खाएगी, पहले subpattern कोष्ठकों में केवल पाठ के अनुरूप होगा (देखना सी # संदर्भ उन्हें कैसे प्राप्त करने के लिए - मैं नहीं बोलता सी #;))

+1

क्या इसे ब्रैकेट को वापस नहीं करने के लिए अनुकूलित किया जा सकता है? केवल सामग्री? – Grant

+2

यह मेरे लिए सही दिखता है। एक वास्तविक '(' चरित्र, फिर समूह शुरू करें, फिर शून्य या अधिक गैर- ') अक्षर से मेल करें, फिर समूह को बंद करें, फिर वास्तविक') 'वर्ण से मेल करें। परिणामस्वरूप समूह को केवल माता-पिता के अंदर क्या होना चाहिए। यह उदाहरण थोड़ा उलझन में है क्योंकि एक समूह शुरू करने के लिए चरित्र सिर्फ '(' और हम एक वास्तविक '(' से मेल खाते हैं '(' '' '' चरित्र को बंद करने के लिए ('चरित्र और बस एक वास्तविक' ('चरित्र, हम पहले बैकस्लैश डालते हैं, जैसे "\\ (", जैसा कि यहां दिखाया गया है। – steveha

+0

यह ब्रैकेट को स्वयं नहीं लौटाता है। –

2

नंगे regex:

\((.*?)\) 

अजगर में आप इसे इस तरह का उपयोग कर सकते हैं:

import re 

rx = re.compile(r'\((.*?)\)') 
s = 'text text text text (hello) text (hello2) (hello3) text' 
rxx = rx.search(s) 
if rxx: 
    print(rxx.group(1)) 
+0

पाइथन रेगेक्स यहां लालची मिलान नहीं करेगा? रिटर्निंग '(हैलो) टेक्स्ट (हैलो 2) (हैलो 3)' पहले और एकमात्र मैच के रूप में? –

+0

ठीक है, अभिव्यक्ति "। *?" पायथन में "। *" का एक गैर लालची संस्करण है। क्या यह सी # में भी काम करता है? – steveha

+0

हम्म, गैर-लालची चाल शायद सी # में काम करती है, इस पृष्ठ में "आलसी और लालची मिलान" देखें: http://www.dijksterhuis.org/regular-expressions-in-csharp-the-basics/ – steveha

1

तार अपेक्षाकृत छोटे हैं, तो आप एक एक मैच के बजाय की जगह इस्तेमाल कर सकते हैं:

string s = Regex.Replace("text text text text (hello) text (hello2) (hello3) text", @"^.*?\(([^)]*)\).*$", "$1"); 
5

यह आपको वापस आ जाएगी केवल ब्रैकेट के पहले सेट के भीतर क्या है:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 

namespace Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Match match = Regex.Match("foo bar (first) foo bar (second) foo", @"\((.*?)\)"); 

      if (match.Groups.Count > 1) 
      { 
       string value = match.Groups[1].Value; 
       System.Console.WriteLine(value); 
      } 
     } 
    } 
} 
संबंधित मुद्दे