RegEx: उद्धरण चिह्नों के बीच मानों को हथियाना


जवाबों:


361

मैं निम्नलिखित का बड़ी सफलता के साथ उपयोग कर रहा हूं:

(["'])(?:(?=(\\?))\2.)*?\1

यह नेस्टेड कोट्स को भी सपोर्ट करता है।

जो लोग इस काम के बारे में गहन व्याख्या चाहते हैं, उनके लिए यहाँ उपयोगकर्ता की ओर से व्याख्या की गई है :

([""'])एक बोली मैच; ((?=(\\?))\2.)यदि बैकस्लैश मौजूद है, तो इसे गॉबल करें, और ऐसा होता है या नहीं, एक चरित्र से मेल खाता है; *?कई बार मेल खाते हैं (गैर-लालची, जैसा कि समापन बोली नहीं खाएं); \1उसी बोली का मिलान करें जिसका उपयोग खोलने के लिए किया गया था।


6
@ जल्दबाजी: यह भी गलत तरीके से मेल खाएगा "foo\"। आगे की चाल ?ट्रिकफायर को प्रभावशाली बनाती है (भले ही रेगेक्स स्वाद ?+सिंटैक्स या परमाणु समूह का समर्थन नहीं करता )
रॉबिन

1
अजगर के साथ यह एक त्रुटि पैदा करता है: sre_constants.error: खुले समूह को संदर्भित नहीं कर सकता
a1an

9
यह मिलान उद्धरण सहित मूल्यों को लौटाता है। क्या उद्धरण के बीच केवल सामग्री वापस करने का कोई मौका नहीं है , जैसा कि अनुरोध किया गया था?
मार्टिन श्नाइडर

4
एक योग्य मात्रा के रूप में एक lookahead का दुरुपयोग पूरी तरह से अनावश्यक और भ्रमित है। बस एक विकल्प का उपयोग करें:(["'])(?:\\.|[^\\])*?\1
अरन-फे

2
खाली तारों से कैसे बचें?
विकास बंसल

333

सामान्य तौर पर, निम्नलिखित नियमित अभिव्यक्ति टुकड़ा है जिसे आप खोज रहे हैं:

"(.*?)"

यह गैर-लालची * का उपयोग करता है? ऑपरेटर सब कुछ पर कब्जा करने के लिए लेकिन अगले दोहरे उद्धरण सहित नहीं। फिर, आप मिलान किए गए पाठ को निकालने के लिए भाषा-विशिष्ट तंत्र का उपयोग करते हैं।

पायथन में, आप कर सकते हैं:

>>> import re
>>> string = '"Foo Bar" "Another Value"'
>>> print re.findall(r'"(.*?)"', string)
['Foo Bar', 'Another Value']

11
यह बहुत अच्छा है, हालांकि यह बच गए उद्धरणों के साथ तार को संभालता नहीं है। जैसे,"hello \" world"
डकैती

जावास्क्रिप्ट के मैच का उपयोग करते हुए, यह उद्धरण चिह्नों के साथ मेल खाएगा। यह यहाँ वर्णित के रूप में निष्पादन पर पुनरावृत्ति के साथ काम करेगा: stackoverflow.com/questions/7998180/…
Kiechlus

4
@robbyt मुझे पता है कि उत्तर के लिए थोड़ा देर हो चुकी है लेकिन, एक नकारात्मक खोज के बारे में क्या? "(.*?(?<!\\))"
मेटुस

4
धन्यवाद - यह सरल है यदि आप सुनिश्चित हैं कि निपटने के लिए कोई बच गए उद्धरण नहीं हैं।
स्क्वायरकैंडी

एक शब्द। बहुत बढ़िया !
शिव अवुला

89

मैं इसके लिए जाऊंगा:

"([^"]*)"

[^ "] को छोड़कर किसी भी चरित्र के लिए regex है ' ' '
कारण मैं गैर लालची कई ऑपरेटर पर इस का उपयोग मुझे लगता है कि बस सुनिश्चित करें कि मैं इसे सही करना सुनिश्चित कर सकें को देख रखने के लिए है।


1
यह विभिन्न रेगेक्स व्याख्याओं के बीच भी अच्छा व्यवहार करता है।
फिल बेनेट

5
इससे मेरी पवित्रता बची है। .NET के RegEx कार्यान्वयन में, "(। *?)" का वांछित प्रभाव नहीं है (यह गैर-लालची कार्य नहीं करता है), लेकिन "([^"] *) "करता है।
जेन्स न्यूबॉयर

यह सबसे अच्छा उत्तर imo है। धन्यवाद
Lmao 123

28

दो कुशल तरीके देखें जो बच गए उद्धरणों से निपटते हैं। ये पैटर्न न तो संक्षिप्त और न ही सौंदर्यपूर्ण होने के लिए डिज़ाइन किए गए हैं, लेकिन कुशल होने के लिए।

इन तरीकों से पहली वर्ण भेदभाव का उपयोग एक विकल्प की लागत के बिना स्ट्रिंग में जल्दी से उद्धरण खोजने के लिए किया जाता है। (विचार वैकल्पिक वर्णों की दो शाखाओं का परीक्षण किए बिना जल्दी से वर्णों को छोड़ने का नहीं है।)

उद्धरणों के बीच की सामग्री को एक अनियंत्रित लूप के साथ वर्णित किया जाता है (दोहराया प्रत्यावर्तन के बजाय) और भी अधिक कुशल होने के लिए: [^"\\]*(?:\\.[^"\\]*)*

स्पष्ट रूप से उन स्ट्रिंग्स से निपटने के लिए जो संतुलित उद्धरण नहीं देते हैं, आप इसके बजाय के पास मात्रात्मक का उपयोग कर सकते हैं: [^"\\]*+(?:\\.[^"\\]*)*+या बहुत अधिक बैकट्रैकिंग को रोकने के लिए, उन्हें अनुकरण करने के लिए एक वैकल्पिक हल। आप यह भी चुन सकते हैं कि एक उद्धृत भाग अगले (गैर-एस्केप) उद्धरण या स्ट्रिंग के अंत तक एक उद्घाटन उद्धरण हो सकता है। इस मामले में किसी भी मात्रात्मक मात्रा का उपयोग करने की आवश्यकता नहीं है, आपको केवल अंतिम उद्धरण को वैकल्पिक बनाने की आवश्यकता है।

सूचना: कभी-कभी उद्धरण बैकस्लैश के साथ नहीं बल्कि उद्धरण को दोहराकर बच जाते हैं। इस मामले में सामग्री उपसमूह इस तरह दिखता है:[^"]*(?:""[^"]*)*

पैटर्न एक कैप्चर ग्रुप और एक बैकरेस के उपयोग से बचते हैं (मेरा मतलब कुछ ऐसा है (["']).....\1) और एक साधारण विकल्प का उपयोग करें लेकिन ["']शुरुआत में, कारक में।

पर्ल जैसे:

["'](?:(?<=")[^"\\]*(?s:\\.[^"\\]*)*"|(?<=')[^'\\]*(?s:\\.[^'\\]*)*')

(ध्यान दें कि (?s:...)गैर-कैप्चरिंग समूह के अंदर डॉटॉल / सिंगललाइन मोड पर स्विच करने के लिए एक सिंटैक्टिक शुगर है। यदि इस सिंटैक्स का समर्थन नहीं किया जाता है तो आप इस मोड को सभी पैटर्न के लिए आसानी से स्विच कर सकते हैं या डॉट को बदल सकते हैं [\s\S])

(जिस तरह से यह पैटर्न लिखा गया है वह पूरी तरह से "हाथ से संचालित" है और अंततः इंजन के आंतरिक अनुकूलन का ध्यान नहीं रखता है)

ECMA स्क्रिप्ट:

(?=["'])(?:"[^"\\]*(?:\\[\s\S][^"\\]*)*"|'[^'\\]*(?:\\[\s\S][^'\\]*)*')

POSIX विस्तारित:

"[^"\\]*(\\(.|\n)[^"\\]*)*"|'[^'\\]*(\\(.|\n)[^'\\]*)*'

या केवल:

"([^"\\]|\\.|\\\n)*"|'([^'\\]|\\.|\\\n)*'

1
पायथन ECMA स्क्रिप्ट को कच्चे स्ट्रिंग प्रारूप के साथ स्वीकार करता है, अर्थात r "" "ECMA स्क्रिप्ट" ""
a1an

1
यह शानदार है, डबल लाइन के अंदर नई लाइन और गाड़ी के रिटर्न से बचने के साथ काम करने के लिए अपने ईसीएमए एक को अनुकूलित करना बहुत आसान था।
डगलस गास्केल

@ douglasg14b: धन्यवाद। ध्यान दें कि यदि आप इसे जावास्क्रिप्ट में उपयोग करना चाहते हैं, तो आपको केवल /pattern/कुछ भी भागने के बिना शाब्दिक संकेतन का उपयोग करने की आवश्यकता है (वस्तु संकेतन के बजाय new RegExp("(?=[\"'])(?:\"[^\"\\\\]*...");)
कासिमिर एट हिप्पोलीटे

@ a1an: हाँ, लेकिन आप पर्ल संस्करण का उपयोग कर सकते हैं यदि आप sयहां से हटाते हैं: (?s:और यदि आप (?s)पैटर्न में कहीं डालते हैं ।
कासिमिर एट हिप्पोलीटे

16

स्वीकृत उत्तर का RegEx मानों को उनके उद्धरण चिह्नों सहित: "Foo Bar"और "Another Value"मैचों के रूप में लौटाता है ।

यहाँ RegEx हैं जो केवल उद्धरण चिह्नों के बीच मान लौटाते हैं (जैसा कि प्रश्नकर्ता पूछ रहा था):

केवल दोहरे उद्धरण (कैप्चर समूह # 1 के मूल्य का उपयोग करें):

"(.*?[^\\])"

केवल एकल उद्धरण (कैप्चर ग्रुप # 1 का उपयोग करें):

'(.*?[^\\])'

दोनों (कैप्चर ग्रुप # 2 का उपयोग मूल्य):

(["'])(.*?[^\\])\1

-

सभी समर्थन बच गए और नेस्टेड उद्धरण।


कृपया, यह क्यों काम करता है? मैं उपयोग कर रहा था, src="(.*)"लेकिन जाहिर है कि यह अंतिम से पहले सब कुछ चुन रहा था ", आपके REGEX, हालांकि, केवल src =" "सामग्री का चयन किया, लेकिन मुझे समझ नहीं आया कि कैसे?
लुकास Bustamante

मुझे यह पसंद है कि यह सादगी के लिए बहुत है, लेकिन यह उद्धरणों के बीच खाली या बिना किसी मूल्य के बहुत अच्छी तरह से संभाल नहीं करता है जैसा कि मैंने खोजा है
RedactedProfile

16

अजीब तरह से, इन उत्तरों में से कोई भी एक रेगेक्स का उत्पादन नहीं करता है जहां लौटा हुआ मैच उद्धरणों के अंदर का पाठ है, जो कि पूछा जाता है। एमए-मैडेन कोशिश करता है लेकिन पूरे मैच के बजाय केवल कैद समूह के रूप में अंदर का मैच प्राप्त करता है। वास्तव में यह करने का एक तरीका होगा:

(?<=(["']\b))(?:(?=(\\?))\2.)*?(?=\1)

इसके लिए उदाहरण इस डेमो https://regex101.com/r/Hbj8aP/1 पर देखे जा सकते हैं

यहाँ कुंजी शुरुआत ?<=में सकारात्मक पॉजिटिव ( ) और अंत में पॉजिटिव लुकहेड है ?=। लुकबाइंड, वर्तमान वर्ण के पीछे एक उद्धरण की जाँच करने के लिए देख रहा है, यदि पाया जाता है तो वहां से शुरू करें और फिर लुकहेड एक उद्धरण के लिए आगे चरित्र की जाँच कर रहा है और यदि उस चरित्र पर रोक पाया जाता है। लुकबाइंड ग्रुप (a ["']) कोष्ठक में लिपटे हुए है, जिसके लिए एक समूह बनाया जाता है, जो कि प्रारंभ में पाया गया था, यह तब अंतिम लुकहैड में उपयोग किया जाता है, यह (?=\1)सुनिश्चित करने के लिए कि यह केवल तभी रुकता है जब वह संबंधित उद्धरण पाता है।

केवल अन्य जटिलता यह है कि क्योंकि लुकहेड वास्तव में अंतिम उद्धरण का उपभोग नहीं करता है, यह फिर से शुरू होने वाले लुकहैब से मिल जाएगा, जिसके कारण एक ही लाइन पर उद्धरण और शुरुआती उद्धरण के बीच का पाठ मेल खाता है। शुरुआती उद्धरण पर एक शब्द सीमा लगाना ( ["']\b) इसके साथ मदद करता है, हालांकि आदर्श रूप से मैं लुकहेड से आगे बढ़ना चाहूंगा लेकिन मुझे नहीं लगता कि यह संभव है। मैं बीच में बच गए पात्रों को सीधे आदम के उत्तर से ले रहा था।


11

बहुत देर से जवाब, लेकिन जवाब देना पसंद है

(\"[\w\s]+\")

http://regex101.com/r/cB0kB8/1


Php में अच्छी तरह से काम करता है।
परपलू

दोनों "होमपेज" पर कब्जा करने के लिए अब तक का एकमात्र उत्तर: स्थानीयकृत ["होम पेज"] स्थानीयकरण ["होम पेज"]
jeleler

8

(["'])(?:(?=(\\?))\2.)*?\1उपरोक्त पैटर्न काम करता है लेकिन मैं इसके प्रदर्शन से चिंतित हूं (यह बुरा नहीं है लेकिन बेहतर हो सकता है)। इसके नीचे की खान ~ 20% तेज है।

पैटर्न "(.*?)"अभी अधूरा है। इसे पढ़ने वाले सभी लोगों के लिए मेरी सलाह सिर्फ इसका उपयोग नहीं है !!!

उदाहरण के लिए, यह कई तारों को पकड़ नहीं सकता है (यदि आवश्यक हो तो मैं एक संपूर्ण परीक्षण-केस प्रदान कर सकता हूं) जैसे नीचे दिया गया है:

$ स्ट्रिंग = 'आप कैसे हैं? मैं \'ठीक हूं , धन्यवाद ';

उनमें से बाकी सभी "अच्छे" हैं जैसे कि ऊपर वाला।

यदि आप वास्तव में प्रदर्शन और परिशुद्धता दोनों की परवाह करते हैं तो नीचे दिए गए अक्षर से शुरू करें:

/(['"])((\\\1|.)*?)\1/gm

मेरे परीक्षणों में यह मेरे द्वारा मिले हर स्ट्रिंग को कवर करता है लेकिन अगर आपको कुछ ऐसा मिलता है जो काम नहीं करता है तो मैं ख़ुशी से इसे आपके लिए अपडेट कर दूंगा।

एक ऑनलाइन regex परीक्षक में मेरे पैटर्न की जाँच करें


1
मुझे आपके पैटर्न की सादगी पसंद है, हालांकि प्रदर्शन-वार कासिमिर एट हिप्पोली का पैटर्न सभी विस्तारित समाधानों को पानी से बाहर निकालता है। इसके अलावा, ऐसा लगता है कि आपके पैटर्न में वाक्य के अंत में एक बची हुई बोली की तरह विस्तारित किनारे वाले मामले हैं।
wp78de

7

मुझे उद्धरण से बचने की अनुमति देते हुए उद्धरणों के बीच सामग्री का मिलान करने के लिए यूजेन मिहाइलेस्क्यू का समाधान पसंद आया । हालाँकि, मैंने भागने के साथ कुछ समस्याओं की खोज की और उन्हें ठीक करने के लिए निम्नलिखित regex के साथ आया:

(['"])(?:(?!\1|\\).|\\.)*\1

यह चाल करता है और अभी भी बहुत सरल और बनाए रखने में आसान है।

डेमो (कुछ और परीक्षण-मामलों के साथ, इसका उपयोग करने और उस पर विस्तार करने के लिए स्वतंत्र महसूस करें)।


पुनश्च: यदि आप केवल पूर्ण मिलान में उद्धरणों के बीच की सामग्री चाहते हैं ( $0), और प्रदर्शन जुर्माना उपयोग से डरते नहीं हैं:

(?<=(['"])\b)(?:(?!\1|\\).|\\.)*(?=\1)

दुर्भाग्य से, एंकर के रूप में उद्धरण के बिना, मुझे एक सीमा जोड़ना था \bजो शुरुआती उद्धरण के बाद रिक्त स्थान और गैर-शब्द सीमा वाले पात्रों के साथ अच्छी तरह से नहीं खेलता है।

वैकल्पिक रूप से, केवल एक समूह$2 जोड़कर प्रारंभिक संस्करण को संशोधित करें और स्ट्रिंग फॉर्म निकालें :

(['"])((?:(?!\1|\\).|\\.)*)\1

पीपीएस: यदि आपका ध्यान पूरी तरह से दक्षता पर है, तो कैसिमिर एट हिप्पोली के समाधान के साथ जाएं ; यह बेहतर है।


अवलोकन: दूसरा रेगेक्स एक ऋण चिह्न के साथ एक मूल्य याद करता है -, जैसे देशांतर निर्देशांक में।
क्रॉकरोडर

मैंने कुछ भी नहीं बदला। यदि आप इस मुद्दे का निरीक्षण नहीं करते हैं तो शायद यह रेगेक्स का स्वाद है जो मैं उपयोग कर रहा हूं। मैं regex101site का उपयोग कर रहा था, मुझे लगता है कि php शैली regex है।
क्रॉकरोड

यहाँ मैं किस बारे में बात कर रहा हूँ का डेमो है। मैं देशांतर (-96.74025) से मेल खाने की उम्मीद कर रहा था, लेकिन ऐसा नहीं है।
क्रॉकरोडर

@Crowcoder धन्यवाद। हां, यह शब्द सीमा के कारण होता है जो एक लंगर के रूप में कार्य करता है और ओवरलैपिंग मैचों से बचने में मदद करता है लेकिन आपके इनपुट के साथ अच्छा नहीं खेलता है। एक अतिरिक्त समूह वास्तव में बेहतर विकल्प है जैसा कि अद्यतन उत्तर में दिया गया है।
wp78de

6

यह संस्करण

  • बच गए उद्धरण के लिए खाते
  • नियंत्रण पीछे

    /(["'])((?:(?!\1)[^\\]|(?:\\\\)*\\[^\\])*)\1/

यह कई तारों को फैलाता है और एक डबल बैकस्लैश को सही ढंग से संभालने के लिए प्रतीत नहीं होता है, उदाहरण के लिए स्ट्रिंग: foo 'stri \\ ng 1' bar 'string 2' और 'string 3' Debuggex Demo
miracle2k

आप किसी वर्ण वर्ग में बैकरेस्ट का उपयोग नहीं कर सकते।
हमजा

5

अधिक जवाब! यहाँ मैं इस्तेमाल किया समाधान है

\"([^\"]*?icon[^\"]*?)\"

TLDR; उक्त उद्धरण और वॉइला में आपकी तलाश क्या है, इसके साथ
शब्द आइकन बदलें !


जिस तरह से यह काम करता है वह कीवर्ड के लिए दिखता है और उद्धरणों के बीच और क्या परवाह नहीं करता है। ईजी:
id="fb-icon"
id="icon-close"
id="large-icon-close"
रेगेक्स एक उद्धरण चिह्न के लिए दिखता है, "
फिर यह अक्षरों के किसी भी संभावित समूह की तलाश करता है, "
जब तक कि यह नहीं मिलता है icon
और अक्षरों का कोई भी संभावित समूह जो ऐसा नहीं "
है, तब वह एक समापन की तलाश में है"


1
आपका बहुत बहुत धन्यवाद। इस उत्तर के regex रिटर्न के बाद से / दूसरे समूह के रूप में (स्वीकृत उत्तर के विपरीत) के name="value"साथ होने वाली प्रत्येक घटना को प्रतिस्थापित करने में सक्षम था । खोजें : बदलें :name={"value"}iconvalue=\"([^\"]*?[^\"]*?)\" ={"$1"}
पलिसंड

मन की व्याख्या डाउनवोट? यह कुछ स्थितियों से अच्छा काम करता है।
जेम्स हैरिंगटन

क्या आप मुझे जवाब दे रहे हैं?
पलिसंड

@ किसी भी स्पष्टीकरण के साथ दूसरे दिन इस पोस्ट को किसी ने डाउन-वोट नहीं किया।
जेम्स हैरिंगटन

यह एकमात्र ऐसा उत्तर प्रतीत होता है जो उद्धरणों के अंदर एक विशिष्ट पाठ पाता है
टॉप-मास्टर

4

मुझे एक्समैन का अधिक विस्तार वाला संस्करण पसंद आया, लेकिन इसके साथ कुछ परेशानी थी (यह उदाहरण के लिए मेल नहीं खाता था

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

3
string = "\" foo bar\" \"loloo\""
print re.findall(r'"(.*?)"',string)

बस यह कोशिश करो, एक आकर्षण की तरह काम करता है !!!

\ संकेत छोड़ें चरित्र


यदि वह पहली पंक्ति वास्तविक पायथन कोड है, तो यह स्ट्रिंग बनाने जा रहा है " foo bar" "loloo"। मुझे लगता है कि आप इसे एक कच्चे तार में लपेटने का मतलब है जैसे आपने रेगेक्स के साथ किया था r'"\" foo bar\" \"loloo\""':। जब भी उपयुक्त हो तो कृपया SO की उत्कृष्ट प्रारूपण क्षमताओं का उपयोग करें । यह सिर्फ सौंदर्य प्रसाधन नहीं है; यदि आप उनका उपयोग नहीं करते हैं तो हम सचमुच यह नहीं बता सकते कि आप क्या कहना चाह रहे हैं। और ढेर अतिप्रवाह में आपका स्वागत है !
एलन मूर

सलाह एलन के लिए धन्यवाद, मैं वास्तव में इस समुदाय के लिए नया हूं, अगली बार मैं निश्चित रूप से यह सब ध्यान में रखूंगा ... ईमानदारी से माफी।
डकैत

2

एडम के जवाब के विपरीत, मेरे पास एक सरल लेकिन एक काम है:

(["'])(?:\\\1|.)*?\1

और यदि आप इस तरह उद्धरणों में सामग्री प्राप्त करना चाहते हैं तो केवल कोष्ठक जोड़ें:

(["'])((?:\\\1|.)*?)\1

फिर $1मैच चर और $2मैच सामग्री स्ट्रिंग से मेल खाता है।


1
echo 'junk "Foo Bar" not empty one "" this "but this" and this neither' | sed 's/[^\"]*\"\([^\"]*\)\"[^\"]*/>\1</g'

इसका परिणाम यह होगा:> फू बार <> <लेकिन यह <

यहाँ मैंने स्पष्टता के लिए परिणाम स्ट्रिंग के बीच में दिखाया, इस गैर-लालची संस्करण का उपयोग करते हुए भी इस सेड कमांड के साथ हमने पहले कबाड़ को बाहर फेंक दिया और उसके बाद "" के बीच के भाग के साथ इसे बदल दिया। 's> और इसे <> के चारों ओर से घेरें।


1

ग्रेग एच। से मैं अपनी आवश्यकताओं के अनुरूप इस रेगेक्स को बनाने में सक्षम था।

मुझे एक विशिष्ट मूल्य से मेल खाने की आवश्यकता थी जो उद्धरण के अंदर होने के द्वारा योग्य था। यह एक पूर्ण मैच होना चाहिए, कोई भी आंशिक मिलान हिट को ट्रिगर नहीं कर सकता है

उदाहरण के लिए "टेस्ट" "टेस्ट 2" के लिए मेल नहीं खा सकता है।

reg = r"""(['"])(%s)\1"""
if re.search(reg%(needle), haystack, re.IGNORECASE):
    print "winning..."

शिकारी


1

यदि आप स्ट्रिंग्स को खोजने की कोशिश कर रहे हैं, जिसमें केवल एक निश्चित प्रत्यय है, जैसे डॉट सिंटैक्स, तो आप यह कोशिश कर सकते हैं:

\"([^\"]*?[^\"]*?)\".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"


1

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

0

मेरे लिए यह एक काम किया:

|([\'"])(.*?)\1|i

मैंने इस तरह से एक वाक्य का उपयोग किया है:

preg_match_all('|([\'"])(.*?)\1|i', $cont, $matches);

और इसने बहुत अच्छा काम किया।


इस दृष्टिकोण की एक कमजोरी यह है कि यह मेल खाएगा जब एक स्ट्रिंग एक एकल उद्धरण के साथ शुरू होती है और एक दोहरे उद्धरण के साथ समाप्त होती है, या इसके विपरीत।
घोप्पेर 21

इसे पकड़ने में भी समस्या है "डोन्ट" को मत भूलना - "डॉन" के बाद यह रुक जाता है।
बेनी न्युगबॉएर

0

उपरोक्त सभी उत्तर अच्छे हैं .... सिवाय इसके कि वे सभी यूनिकोड वर्णों का समर्थन नहीं करते हैं! ECMA स्क्रिप्ट (जावास्क्रिप्ट) पर

यदि आप एक नोड उपयोगकर्ता हैं, तो आप सभी यूनिकोड वर्णों का समर्थन करने वाले स्वीकृत उत्तर का संशोधित संस्करण चाहते हैं:

/(?<=((?<=[\s,.:;"']|^)["']))(?:(?=(\\?))\2.)*?(?=\1)/gmu

यहाँ कोशिश करो ।


1
एक गैर-यूनिकोड चरित्र क्या है? AFAIK यूनिकोड में सभी वर्ण शामिल हैं
टोटो

1
आपको क्यों लगता है कि यह एक जावास्क्रिप्ट प्रश्न है? इसके अलावा, lookbehind सभी ब्राउज़रों में समर्थित नहीं है, regex101 फेंकता है? The preceding token is not quantifiable
टोटो

@ तो, मेरा मतलब है "सभी यूनिकोड चरित्र का समर्थन नहीं करता है"। धन्यवाद। हालांकि यह सवाल सामान्य तौर पर रेगेक्स के बारे में है, मैं सिर्फ इस बात पर जोर नहीं देना चाहता कि शब्द सीमा के उपयोग से जावास्क्रिप्ट में अवांछित व्यवहार होगा। और जाहिर है, जबकि Javascripts आमतौर पर ब्राउज़र के लिए होते हैं, वहाँ भी नोड है।
डोनोवन पी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.