2010-10-26 12 views
19

कृपया ध्यान से पढ़ें: यह थोड़ा असामान्य है और आप "रेगेक्स" या "दोस्त का उपयोग कैसे नहीं करते हैं, बस स्ट्रिंग.SubString का उपयोग करने की तरह नहीं है"(), "आदि ...दो अक्षरों के बीच पाठ प्राप्त करने के लिए रेगेक्स

मुझे रेगेक्स (एक पूर्व-मौजूदा विधि का उपयोग करने के लिए) लिखने की आवश्यकता है जो घुंघराले ब्रेसिज़ के बीच पाठ से मेल खाएगा, लेकिन घुंघराले ब्रेसिज़ स्वयं को नहीं।

उदाहरण के लिए: "{MatchThisText}" और "ला ला ला {MatchThisText} ला ला ला ..."
चाहिए दोनों मैच: "MatchThisText"

Someone asked this exact question a year ago, और वह regexes के लिए समाधान का एक गुच्छा मिला है जो "MatchThisText" के अलावा घुंघराले ब्रेसिज़ से मेल खाता है, जिसके परिणामस्वरूप "{MatchThisText}" का एक मैच होता है जो वह (या मुझे) की आवश्यकता नहीं होती है।

अगर कोई रेगेक्स लिख सकता है जो वास्तव में घुंघराले ब्रेसिज़ के बीच केवल वर्णों से मेल खाता है, तो मैं वास्तव में इसकी सराहना करता हूं। इसे किसी भी ASCII मानों की अनुमति देनी चाहिए, और पहले समापन ब्रैकेट पर मैच को रोकना चाहिए।

उदाहरण के लिए: "{retailCategoryUrl}/{फिल्टर}"
मैच चाहिए: retailCategoryUrl और फिल्टर
नहीं बल्कि मैच: "retailCategoryUrl}/{फिल्टर" (सब कुछ है लेकिन बाहरी ब्रेसिज़)

अरे, यह मेरे लिए वास्तव में एक मुश्किल है, इसलिए यदि आप में से कुछ के लिए यह मामूली है तो कृपया प्रश्न को क्षमा करें।

धन्यवाद!

+0

काफी आसान (समूहीकरण आवश्यकता है, लेकिन ईमानदारी से, यह एक बहुत मौलिक विशेषता है), जब तक आप नेस्टेड ब्रेसिज़ "सही ढंग से" पर विचार करना चाहते: यहाँ एक उदाहरण है कि टेम्पलेट तार machting के लिए css' और 'के बीच पाठ machtes है (उदाहरण के लिए पूर्ण उड़ा पार्सर्स करते हैं), इस मामले में यह असंभव है (उन गैर-रेगेक्स-वाई एक्सटेंशन का उपयोग करते समय कुछ कार्यान्वयन, जैसे नेट, है)। – delnan

+0

हमें अधिक संदर्भ की आवश्यकता होगी, क्योंकि समाधान में शायद पीछे-पीछे और आगे के ऑपरेटर शामिल होंगे, इसलिए आप जिस रेगेक्स का उपयोग कर रहे हैं उसकी बोली पर निर्भर करते हैं। –

+0

'{(\ w +)}' - ब्रैकेट समूह को इंगित करते हैं, जिसे आप सामग्री प्राप्त कर सकते हैं। –

उत्तर

17

पायथन:

(?<={)[^}]*(?=}) 

संदर्भ में:

#!/usr/bin/env python 

import re 

def f(regexStr,target): 
    mo = re.search(regexStr,target) 
    if not mo: 
     print "NO MATCH" 
    else: 
     print "MATCH:",mo.group() 

f(r"(?<={)[^}]*(?=})","{MatchThisText}") 
f(r"(?<={)[^}]*(?=})","La la la {MatchThisText} la la la...") 

प्रिंट:

MATCH: MatchThisText 
MATCH: MatchThisText 
+1

के साथ कुछ करें नोटिस करें कि कभी-कभी आपको कुछ {'? <= \ {) [^ \}] * (? = \}) '^ का उपयोग करके' {'से बचने की आवश्यकता होगी क्योंकि कुछ अनुप्रयोग पुनरावृत्ति ऑपरेटर के लिए खड़े होने के रूप में घुंघराले ब्रैकेट के बारे में सोचने की कोशिश करेंगे। – andi

8

आप एक गैर लालची मैच ऑपरेटर, *? की आवश्यकता होगी, मैच को रोकने के लिए जैसे ही इंजन एक बंद कर्लिंग ब्रेस देखता है। फिर आपको ब्रांड्स के अंदर ब्रांड्स के अंदर क्या समूह बनाना होगा। यह यह करना चाहिए:

{(.*?)} 

तब आप अपने regex एपीआई में group संख्या 1 से मूल्य प्राप्त करने की आवश्यकता होगी।

+0

बहुत उपयोगी, धन्यवाद! – mdegges

12

(आप ऐसा करेंगे कैसे है कि आपके प्रोग्रामिंग भाषा/एपीआई पर निर्भर करता है।) आप अग्रदर्शी और अजगर की तरह lookbehind समर्थन के साथ एक रेगुलर एक्सप्रेशन इंजन का उपयोग कर रहे हैं तो ऐसा नहीं है, तो आप

/(?<={)[^}]*(?=})/

उपयोग कर सकते हैं टी (जावास्क्रिप्ट की तरह), आप /{([^}]*)}/ का उपयोग कर सकते हैं और सबस्ट्रिंग मैच प्राप्त कर सकते हैं।जावास्क्रिप्ट उदाहरण: .NET Regex साथ

"{foo}".match(/{([^}]*)}/)[1] // => 'foo'

0

current answer काम करता है, लेकिन सभी मैचों में घुंघराले ब्रेसिज़ हटाने की जरूरत:

var regex = new Regex(@"(?<={)[^}]*(?=})", RegexOptions.Compiled); 
var results = regex.Matches(source) 
        .Cast<Match>() 
        .Select(m => m.Value.TrimStart('{').TrimEnd('}')); 
0

जावास्क्रिप्ट में आप सभी मैचों के साथ एक सरणी मिलता है।

yourstring.match(/css`([^}]+).`/gmi) 
संबंधित मुद्दे