जवाबों:
मैं निम्नलिखित का बड़ी सफलता के साथ उपयोग कर रहा हूं:
(["'])(?:(?=(\\?))\2.)*?\1
यह नेस्टेड कोट्स को भी सपोर्ट करता है।
जो लोग इस काम के बारे में गहन व्याख्या चाहते हैं, उनके लिए यहाँ उपयोगकर्ता की ओर से व्याख्या की गई है :
([""'])एक बोली मैच;((?=(\\?))\2.)यदि बैकस्लैश मौजूद है, तो इसे गॉबल करें, और ऐसा होता है या नहीं, एक चरित्र से मेल खाता है;*?कई बार मेल खाते हैं (गैर-लालची, जैसा कि समापन बोली नहीं खाएं);\1उसी बोली का मिलान करें जिसका उपयोग खोलने के लिए किया गया था।
"foo\"। आगे की चाल ?ट्रिकफायर को प्रभावशाली बनाती है (भले ही रेगेक्स स्वाद ?+सिंटैक्स या परमाणु समूह का समर्थन नहीं करता )
(["'])(?:\\.|[^\\])*?\1
सामान्य तौर पर, निम्नलिखित नियमित अभिव्यक्ति टुकड़ा है जिसे आप खोज रहे हैं:
"(.*?)"
यह गैर-लालची * का उपयोग करता है? ऑपरेटर सब कुछ पर कब्जा करने के लिए लेकिन अगले दोहरे उद्धरण सहित नहीं। फिर, आप मिलान किए गए पाठ को निकालने के लिए भाषा-विशिष्ट तंत्र का उपयोग करते हैं।
पायथन में, आप कर सकते हैं:
>>> import re
>>> string = '"Foo Bar" "Another Value"'
>>> print re.findall(r'"(.*?)"', string)
['Foo Bar', 'Another Value']
"hello \" world"
"(.*?(?<!\\))"
मैं इसके लिए जाऊंगा:
"([^"]*)"
[^ "] को छोड़कर किसी भी चरित्र के लिए regex है ' ' '
कारण मैं गैर लालची कई ऑपरेटर पर इस का उपयोग मुझे लगता है कि बस सुनिश्चित करें कि मैं इसे सही करना सुनिश्चित कर सकें को देख रखने के लिए है।
दो कुशल तरीके देखें जो बच गए उद्धरणों से निपटते हैं। ये पैटर्न न तो संक्षिप्त और न ही सौंदर्यपूर्ण होने के लिए डिज़ाइन किए गए हैं, लेकिन कुशल होने के लिए।
इन तरीकों से पहली वर्ण भेदभाव का उपयोग एक विकल्प की लागत के बिना स्ट्रिंग में जल्दी से उद्धरण खोजने के लिए किया जाता है। (विचार वैकल्पिक वर्णों की दो शाखाओं का परीक्षण किए बिना जल्दी से वर्णों को छोड़ने का नहीं है।)
उद्धरणों के बीच की सामग्री को एक अनियंत्रित लूप के साथ वर्णित किया जाता है (दोहराया प्रत्यावर्तन के बजाय) और भी अधिक कुशल होने के लिए: [^"\\]*(?:\\.[^"\\]*)*
स्पष्ट रूप से उन स्ट्रिंग्स से निपटने के लिए जो संतुलित उद्धरण नहीं देते हैं, आप इसके बजाय के पास मात्रात्मक का उपयोग कर सकते हैं: [^"\\]*+(?:\\.[^"\\]*)*+या बहुत अधिक बैकट्रैकिंग को रोकने के लिए, उन्हें अनुकरण करने के लिए एक वैकल्पिक हल। आप यह भी चुन सकते हैं कि एक उद्धृत भाग अगले (गैर-एस्केप) उद्धरण या स्ट्रिंग के अंत तक एक उद्घाटन उद्धरण हो सकता है। इस मामले में किसी भी मात्रात्मक मात्रा का उपयोग करने की आवश्यकता नहीं है, आपको केवल अंतिम उद्धरण को वैकल्पिक बनाने की आवश्यकता है।
सूचना: कभी-कभी उद्धरण बैकस्लैश के साथ नहीं बल्कि उद्धरण को दोहराकर बच जाते हैं। इस मामले में सामग्री उपसमूह इस तरह दिखता है:[^"]*(?:""[^"]*)*
पैटर्न एक कैप्चर ग्रुप और एक बैकरेस के उपयोग से बचते हैं (मेरा मतलब कुछ ऐसा है (["']).....\1) और एक साधारण विकल्प का उपयोग करें लेकिन ["']शुरुआत में, कारक में।
पर्ल जैसे:
["'](?:(?<=")[^"\\]*(?s:\\.[^"\\]*)*"|(?<=')[^'\\]*(?s:\\.[^'\\]*)*')
(ध्यान दें कि (?s:...)गैर-कैप्चरिंग समूह के अंदर डॉटॉल / सिंगललाइन मोड पर स्विच करने के लिए एक सिंटैक्टिक शुगर है। यदि इस सिंटैक्स का समर्थन नहीं किया जाता है तो आप इस मोड को सभी पैटर्न के लिए आसानी से स्विच कर सकते हैं या डॉट को बदल सकते हैं [\s\S])
(जिस तरह से यह पैटर्न लिखा गया है वह पूरी तरह से "हाथ से संचालित" है और अंततः इंजन के आंतरिक अनुकूलन का ध्यान नहीं रखता है)
ECMA स्क्रिप्ट:
(?=["'])(?:"[^"\\]*(?:\\[\s\S][^"\\]*)*"|'[^'\\]*(?:\\[\s\S][^'\\]*)*')
POSIX विस्तारित:
"[^"\\]*(\\(.|\n)[^"\\]*)*"|'[^'\\]*(\\(.|\n)[^'\\]*)*'
या केवल:
"([^"\\]|\\.|\\\n)*"|'([^'\\]|\\.|\\\n)*'
/pattern/कुछ भी भागने के बिना शाब्दिक संकेतन का उपयोग करने की आवश्यकता है (वस्तु संकेतन के बजाय new RegExp("(?=[\"'])(?:\"[^\"\\\\]*...");)
sयहां से हटाते हैं: (?s:और यदि आप (?s)पैटर्न में कहीं डालते हैं ।
स्वीकृत उत्तर का RegEx मानों को उनके उद्धरण चिह्नों सहित: "Foo Bar"और "Another Value"मैचों के रूप में लौटाता है ।
यहाँ RegEx हैं जो केवल उद्धरण चिह्नों के बीच मान लौटाते हैं (जैसा कि प्रश्नकर्ता पूछ रहा था):
केवल दोहरे उद्धरण (कैप्चर समूह # 1 के मूल्य का उपयोग करें):
"(.*?[^\\])"
केवल एकल उद्धरण (कैप्चर ग्रुप # 1 का उपयोग करें):
'(.*?[^\\])'
दोनों (कैप्चर ग्रुप # 2 का उपयोग मूल्य):
(["'])(.*?[^\\])\1
-
सभी समर्थन बच गए और नेस्टेड उद्धरण।
src="(.*)"लेकिन जाहिर है कि यह अंतिम से पहले सब कुछ चुन रहा था ", आपके REGEX, हालांकि, केवल src =" "सामग्री का चयन किया, लेकिन मुझे समझ नहीं आया कि कैसे?
अजीब तरह से, इन उत्तरों में से कोई भी एक रेगेक्स का उत्पादन नहीं करता है जहां लौटा हुआ मैच उद्धरणों के अंदर का पाठ है, जो कि पूछा जाता है। एमए-मैडेन कोशिश करता है लेकिन पूरे मैच के बजाय केवल कैद समूह के रूप में अंदर का मैच प्राप्त करता है। वास्तव में यह करने का एक तरीका होगा:
(?<=(["']\b))(?:(?=(\\?))\2.)*?(?=\1)
इसके लिए उदाहरण इस डेमो https://regex101.com/r/Hbj8aP/1 पर देखे जा सकते हैं
यहाँ कुंजी शुरुआत ?<=में सकारात्मक पॉजिटिव ( ) और अंत में पॉजिटिव लुकहेड है ?=। लुकबाइंड, वर्तमान वर्ण के पीछे एक उद्धरण की जाँच करने के लिए देख रहा है, यदि पाया जाता है तो वहां से शुरू करें और फिर लुकहेड एक उद्धरण के लिए आगे चरित्र की जाँच कर रहा है और यदि उस चरित्र पर रोक पाया जाता है। लुकबाइंड ग्रुप (a ["']) कोष्ठक में लिपटे हुए है, जिसके लिए एक समूह बनाया जाता है, जो कि प्रारंभ में पाया गया था, यह तब अंतिम लुकहैड में उपयोग किया जाता है, यह (?=\1)सुनिश्चित करने के लिए कि यह केवल तभी रुकता है जब वह संबंधित उद्धरण पाता है।
केवल अन्य जटिलता यह है कि क्योंकि लुकहेड वास्तव में अंतिम उद्धरण का उपभोग नहीं करता है, यह फिर से शुरू होने वाले लुकहैब से मिल जाएगा, जिसके कारण एक ही लाइन पर उद्धरण और शुरुआती उद्धरण के बीच का पाठ मेल खाता है। शुरुआती उद्धरण पर एक शब्द सीमा लगाना ( ["']\b) इसके साथ मदद करता है, हालांकि आदर्श रूप से मैं लुकहेड से आगे बढ़ना चाहूंगा लेकिन मुझे नहीं लगता कि यह संभव है। मैं बीच में बच गए पात्रों को सीधे आदम के उत्तर से ले रहा था।
(["'])(?:(?=(\\?))\2.)*?\1उपरोक्त पैटर्न काम करता है लेकिन मैं इसके प्रदर्शन से चिंतित हूं (यह बुरा नहीं है लेकिन बेहतर हो सकता है)। इसके नीचे की खान ~ 20% तेज है।
पैटर्न "(.*?)"अभी अधूरा है। इसे पढ़ने वाले सभी लोगों के लिए मेरी सलाह सिर्फ इसका उपयोग नहीं है !!!
उदाहरण के लिए, यह कई तारों को पकड़ नहीं सकता है (यदि आवश्यक हो तो मैं एक संपूर्ण परीक्षण-केस प्रदान कर सकता हूं) जैसे नीचे दिया गया है:
$ स्ट्रिंग = 'आप कैसे हैं? मैं
\'ठीक हूं , धन्यवाद ';
उनमें से बाकी सभी "अच्छे" हैं जैसे कि ऊपर वाला।
यदि आप वास्तव में प्रदर्शन और परिशुद्धता दोनों की परवाह करते हैं तो नीचे दिए गए अक्षर से शुरू करें:
/(['"])((\\\1|.)*?)\1/gm
मेरे परीक्षणों में यह मेरे द्वारा मिले हर स्ट्रिंग को कवर करता है लेकिन अगर आपको कुछ ऐसा मिलता है जो काम नहीं करता है तो मैं ख़ुशी से इसे आपके लिए अपडेट कर दूंगा।
मुझे उद्धरण से बचने की अनुमति देते हुए उद्धरणों के बीच सामग्री का मिलान करने के लिए यूजेन मिहाइलेस्क्यू का समाधान पसंद आया । हालाँकि, मैंने भागने के साथ कुछ समस्याओं की खोज की और उन्हें ठीक करने के लिए निम्नलिखित regex के साथ आया:
(['"])(?:(?!\1|\\).|\\.)*\1
यह चाल करता है और अभी भी बहुत सरल और बनाए रखने में आसान है।
डेमो (कुछ और परीक्षण-मामलों के साथ, इसका उपयोग करने और उस पर विस्तार करने के लिए स्वतंत्र महसूस करें)।
पुनश्च: यदि आप केवल पूर्ण मिलान में उद्धरणों के बीच की सामग्री चाहते हैं ( $0), और प्रदर्शन जुर्माना उपयोग से डरते नहीं हैं:
(?<=(['"])\b)(?:(?!\1|\\).|\\.)*(?=\1)
दुर्भाग्य से, एंकर के रूप में उद्धरण के बिना, मुझे एक सीमा जोड़ना था \bजो शुरुआती उद्धरण के बाद रिक्त स्थान और गैर-शब्द सीमा वाले पात्रों के साथ अच्छी तरह से नहीं खेलता है।
वैकल्पिक रूप से, केवल एक समूह$2 जोड़कर प्रारंभिक संस्करण को संशोधित करें और स्ट्रिंग फॉर्म निकालें :
(['"])((?:(?!\1|\\).|\\.)*)\1
पीपीएस: यदि आपका ध्यान पूरी तरह से दक्षता पर है, तो कैसिमिर एट हिप्पोली के समाधान के साथ जाएं ; यह बेहतर है।
-, जैसे देशांतर निर्देशांक में।
यह संस्करण
नियंत्रण पीछे
/(["'])((?:(?!\1)[^\\]|(?:\\\\)*\\[^\\])*)\1/अधिक जवाब! यहाँ मैं इस्तेमाल किया समाधान है
\"([^\"]*?icon[^\"]*?)\"
TLDR; उक्त उद्धरण और वॉइला में आपकी तलाश क्या है, इसके साथ
शब्द आइकन बदलें !
जिस तरह से यह काम करता है वह कीवर्ड के लिए दिखता है और उद्धरणों के बीच और क्या परवाह नहीं करता है। ईजी:
id="fb-icon"
id="icon-close"
id="large-icon-close"
रेगेक्स एक उद्धरण चिह्न के लिए दिखता है, "
फिर यह अक्षरों के किसी भी संभावित समूह की तलाश करता है, "
जब तक कि यह नहीं मिलता है icon
और अक्षरों का कोई भी संभावित समूह जो ऐसा नहीं "
है, तब वह एक समापन की तलाश में है"
name="value"साथ होने वाली प्रत्येक घटना को प्रतिस्थापित करने में सक्षम था । खोजें : बदलें :name={"value"}iconvalue=\"([^\"]*?[^\"]*?)\" ={"$1"}
मुझे एक्समैन का अधिक विस्तार वाला संस्करण पसंद आया, लेकिन इसके साथ कुछ परेशानी थी (यह उदाहरण के लिए मेल नहीं खाता था
foo "string \\ string" bar
या
foo "string1" bar "string2"
सही ढंग से, इसलिए मैंने इसे ठीक करने की कोशिश की:
# opening quote
(["'])
(
# repeat (non-greedy, so we don't span multiple strings)
(?:
# anything, except not the opening quote, and not
# a backslash, which are handled separately.
(?!\1)[^\\]
|
# consume any double backslash (unnecessary?)
(?:\\\\)*
|
# Allow backslash to escape characters
\\.
)*?
)
# same character as opening quote
\1
string = "\" foo bar\" \"loloo\""
print re.findall(r'"(.*?)"',string)
बस यह कोशिश करो, एक आकर्षण की तरह काम करता है !!!
\ संकेत छोड़ें चरित्र
" foo bar" "loloo"। मुझे लगता है कि आप इसे एक कच्चे तार में लपेटने का मतलब है जैसे आपने रेगेक्स के साथ किया था r'"\" foo bar\" \"loloo\""':। जब भी उपयुक्त हो तो कृपया SO की उत्कृष्ट प्रारूपण क्षमताओं का उपयोग करें । यह सिर्फ सौंदर्य प्रसाधन नहीं है; यदि आप उनका उपयोग नहीं करते हैं तो हम सचमुच यह नहीं बता सकते कि आप क्या कहना चाह रहे हैं। और ढेर अतिप्रवाह में आपका स्वागत है !
echo 'junk "Foo Bar" not empty one "" this "but this" and this neither' | sed 's/[^\"]*\"\([^\"]*\)\"[^\"]*/>\1</g'
इसका परिणाम यह होगा:> फू बार <> <लेकिन यह <
यहाँ मैंने स्पष्टता के लिए परिणाम स्ट्रिंग के बीच में दिखाया, इस गैर-लालची संस्करण का उपयोग करते हुए भी इस सेड कमांड के साथ हमने पहले कबाड़ को बाहर फेंक दिया और उसके बाद "" के बीच के भाग के साथ इसे बदल दिया। 's> और इसे <> के चारों ओर से घेरें।
ग्रेग एच। से मैं अपनी आवश्यकताओं के अनुरूप इस रेगेक्स को बनाने में सक्षम था।
मुझे एक विशिष्ट मूल्य से मेल खाने की आवश्यकता थी जो उद्धरण के अंदर होने के द्वारा योग्य था। यह एक पूर्ण मैच होना चाहिए, कोई भी आंशिक मिलान हिट को ट्रिगर नहीं कर सकता है
उदाहरण के लिए "टेस्ट" "टेस्ट 2" के लिए मेल नहीं खा सकता है।
reg = r"""(['"])(%s)\1"""
if re.search(reg%(needle), haystack, re.IGNORECASE):
print "winning..."
शिकारी
यदि आप स्ट्रिंग्स को खोजने की कोशिश कर रहे हैं, जिसमें केवल एक निश्चित प्रत्यय है, जैसे डॉट सिंटैक्स, तो आप यह कोशिश कर सकते हैं:
\"([^\"]*?[^\"]*?)\".localized
.localizedप्रत्यय कहां है।
उदाहरण:
print("this is something I need to return".localized + "so is this".localized + "but this is not")
यह कब्जा होगा "this is something I need to return".localizedऔर "so is this".localizedनहीं लेकिन "but this is not"।
Microsoft VBA कोडर्स के सबसेट का एक पूरक उत्तर केवल पुस्तकालय का उपयोग करता है Microsoft VBScript Regular Expressions 5.5और यह निम्नलिखित कोड देता है
Sub TestRegularExpression()
Dim oRE As VBScript_RegExp_55.RegExp '* Tools->References: Microsoft VBScript Regular Expressions 5.5
Set oRE = New VBScript_RegExp_55.RegExp
oRE.Pattern = """([^""]*)"""
oRE.Global = True
Dim sTest As String
sTest = """Foo Bar"" ""Another Value"" something else"
Debug.Assert oRE.test(sTest)
Dim oMatchCol As VBScript_RegExp_55.MatchCollection
Set oMatchCol = oRE.Execute(sTest)
Debug.Assert oMatchCol.Count = 2
Dim oMatch As Match
For Each oMatch In oMatchCol
Debug.Print oMatch.SubMatches(0)
Next oMatch
End Sub
मेरे लिए यह एक काम किया:
|([\'"])(.*?)\1|i
मैंने इस तरह से एक वाक्य का उपयोग किया है:
preg_match_all('|([\'"])(.*?)\1|i', $cont, $matches);
और इसने बहुत अच्छा काम किया।
उपरोक्त सभी उत्तर अच्छे हैं .... सिवाय इसके कि वे सभी यूनिकोड वर्णों का समर्थन नहीं करते हैं! ECMA स्क्रिप्ट (जावास्क्रिप्ट) पर
यदि आप एक नोड उपयोगकर्ता हैं, तो आप सभी यूनिकोड वर्णों का समर्थन करने वाले स्वीकृत उत्तर का संशोधित संस्करण चाहते हैं:
/(?<=((?<=[\s,.:;"']|^)["']))(?:(?=(\\?))\2.)*?(?=\1)/gmu
यहाँ कोशिश करो ।
? The preceding token is not quantifiable