मैं " It's big \"problem "
एक नियमित अभिव्यक्ति का उपयोग करके प्रतिस्थापन कैसे प्राप्त करूं ?
s = ' function(){ return " It\'s big \"problem "; }';
मैं " It's big \"problem "
एक नियमित अभिव्यक्ति का उपयोग करके प्रतिस्थापन कैसे प्राप्त करूं ?
s = ' function(){ return " It\'s big \"problem "; }';
जवाबों:
/"(?:[^"\\]|\\.)*"/
रेगेक्स कोच और पीसीआरई कार्यक्षेत्र में काम करता है।
जावास्क्रिप्ट में परीक्षण का उदाहरण:
var s = ' function(){ return " Is big \\"problem\\", \\no? "; }';
var m = s.match(/"(?:[^"\\]|\\.)*"/);
if (m != null)
alert(m);
(?:...)
एक निष्क्रिय या गैर-कैप्चरिंग समूह है। इसका मतलब है कि इसे बाद में वापस नहीं किया जा सकता है।
/(["'])(?:[^\1\\]|\\.)*?\1/
var s = ' my \\"new\\" string and \"this should be matched\"';
, इस दृष्टिकोण से अप्रत्याशित परिणाम प्राप्त होंगे।
यह एक linux distros में उपलब्ध nanorc.sample से आता है। इसका उपयोग C स्टाइल स्ट्रिंग्स के सिंटैक्स हाइलाइटिंग के लिए किया जाता है
\"(\\.|[^\"])*\"
var s = ' my \\"new\\" string and \"this should be matched\"';
, इस दृष्टिकोण से अप्रत्याशित परिणाम प्राप्त होंगे।
" \"(\\\\.|[^\\\"])*\" "
जैसा कि ePharaoh द्वारा प्रदान किया गया है, इसका उत्तर है
/"([^"\\]*(\\.[^"\\]*)*)"/
उपरोक्त उद्धृत करने के लिए या तो एकल उद्धृत या डबल उद्धृत स्ट्रिंग का उपयोग करें
/"([^"\\]*(\\.[^"\\]*)*)"|\'([^\'\\]*(\\.[^\'\\]*)*)\'/
यहां दिए गए अधिकांश समाधान वैकल्पिक पुनरावृत्ति पथों का उपयोग करते हैं अर्थात (ए | बी) *।
आप बड़े इनपुट पर स्टैक ओवरफ्लो का सामना कर सकते हैं क्योंकि कुछ पैटर्न कंपाइलर पुनरावृत्ति का उपयोग करके इसे लागू करता है।
उदाहरण के लिए जावा: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=63333993
कुछ इस तरह से:
"(?:[^"\\]*(?:\\.)?)*"
या गाइ बेडफोर्ड द्वारा प्रदान किए गए एक सबसे स्टैक ओवरफ्लो से बचने के लिए पार्सिंग चरणों की मात्रा कम हो जाएगी।
/"(?:[^"\\]++|\\.)*+"/
man perlre
एक लिनक्स सिस्टम पर सीधे से लिया गया है जिसमें पर्ल 5.22.0 स्थापित है। एक अनुकूलन के रूप में, यह रेगेक्स दोनों के 'पॉजेसिव' रूप का उपयोग करता है +
और *
बैकट्रैकिंग को रोकने के लिए, क्योंकि यह पहले से ही जाना जाता है कि क्लोजिंग उद्धरण के बिना एक स्ट्रिंग किसी भी मामले में मेल नहीं खाएगी।
/(["\']).*?(?<!\\)(\\\\)*\1/is
किसी भी उद्धृत स्ट्रिंग के साथ काम करना चाहिए
यह एक PCRE पर सही काम करता है और StackOverflow के साथ नहीं आता है।
"(.*?[^\\])??((\\\\)+)?+"
स्पष्टीकरण:
"
:;.*?
{आलसी मैच}; गैर पलायन चरित्र के साथ समाप्त [^\\]
;(.*?[^\\])??
"
) के साथ समाप्त होता है , लेकिन यह भागने के संकेत जोड़े की संख्या के साथ भी हो सकता है (\\\\)+
; और यह लालची (!) वैकल्पिक है: ((\\\\)+)?+
{लालची मिलान}, बेकेज स्ट्रिंग जोड़े को समाप्त किए बिना या खाली हो सकता है!"(.*?[^\\])?(\\\\)*"
यहाँ एक है जो दोनों "और 'के साथ काम करता है और आप शुरू में दूसरों को आसानी से जोड़ते हैं।
( "| ') (? \\\ 1 | [^ \ 1])? * \ 1
यह बैकरेफेरेंस (\ 1) मैच का उपयोग करता है जो पहले समूह ("या ') में है।
[^\1]
इसके साथ प्रतिस्थापित किया जाना चाहिए .
क्योंकि एंटी-बैक-रेफ़रेंस जैसी कोई चीज नहीं है, और यह किसी भी तरह से मायने नहीं रखता है। पहली स्थिति हमेशा कुछ भी खराब होने से पहले मेल खाएगी।
[^\1]
के साथ .
प्रभावी ढंग से करने के लिए इस regex बदल जाएगा ("|').*?\1
और फिर इसे से मेल खाएंगे "foo\"
में "foo \" bar"
। कहा, [^\1]
वास्तव में काम करना कठिन है। @ Mathiashansen - आप बेहतर (?!\1).
दक्षता के साथ अनिच्छुक और महंगे हैं (इसलिए पूरा रीगेक्स, कुछ दक्षता के साथ, ऐसा होगा (["'])(?:\\.|(?!\1).)*+\1
। +
वैकल्पिक है यदि आपका इंजन इसका समर्थन नहीं करता है।
एक विकल्प जिसे पहले नहीं छुआ गया है:
इसमें जोड़ा गया बोनस है जो खुले हुए टैग से बचकर सही मिलान करने में सक्षम है।
कहते हैं कि आपके पास निम्नलिखित स्ट्रिंग थी; String \"this "should" NOT match\" and "this \"should\" match"
यहां, \"this "should" NOT match\"
मिलान नहीं किया "should"
जाना चाहिए और होना चाहिए। उसके शीर्ष पर this \"should\" match
मिलान किया जाना चाहिए और\"should\"
होना चाहिए नहीं होना चाहिए।
पहला उदाहरण।
// The input string.
const myString = 'String \\"this "should" NOT match\\" and "this \\"should\\" match"';
// The RegExp.
const regExp = new RegExp(
// Match close
'([\'"])(?!(?:[\\\\]{2})*[\\\\](?![\\\\]))' +
'((?:' +
// Match escaped close quote
'(?:\\1(?=(?:[\\\\]{2})*[\\\\](?![\\\\])))|' +
// Match everything thats not the close quote
'(?:(?!\\1).)' +
'){0,})' +
// Match open
'(\\1)(?!(?:[\\\\]{2})*[\\\\](?![\\\\]))',
'g'
);
// Reverse the matched strings.
matches = myString
// Reverse the string.
.split('').reverse().join('')
// '"hctam "\dluohs"\ siht" dna "\hctam TON "dluohs" siht"\ gnirtS'
// Match the quoted
.match(regExp)
// ['"hctam "\dluohs"\ siht"', '"dluohs"']
// Reverse the matches
.map(x => x.split('').reverse().join(''))
// ['"this \"should\" match"', '"should"']
// Re order the matches
.reverse();
// ['"should"', '"this \"should\" match"']
ठीक है, अब RegExp समझाने के लिए। यह regexp आसानी से तीन टुकड़ों में टूट सकता है। निम्नलिखित नुसार:
# Part 1
(['"]) # Match a closing quotation mark " or '
(?! # As long as it's not followed by
(?:[\\]{2})* # A pair of escape characters
[\\] # and a single escape
(?![\\]) # As long as that's not followed by an escape
)
# Part 2
((?: # Match inside the quotes
(?: # Match option 1:
\1 # Match the closing quote
(?= # As long as it's followed by
(?:\\\\)* # A pair of escape characters
\\ #
(?![\\]) # As long as that's not followed by an escape
) # and a single escape
)| # OR
(?: # Match option 2:
(?!\1). # Any character that isn't the closing quote
)
)*) # Match the group 0 or more times
# Part 3
(\1) # Match an open quotation mark that is the same as the closing one
(?! # As long as it's not followed by
(?:[\\]{2})* # A pair of escape characters
[\\] # and a single escape
(?![\\]) # As long as that's not followed by an escape
)
यह शायद छवि के रूप में बहुत स्पष्ट है: जेक्स रेगुलेक्स का उपयोग करके उत्पन्न
गितुब पर छवि (जावास्क्रिप्ट नियमित अभिव्यक्ति विज़ुअलाइज़र।) क्षमा करें, मेरे पास छवियों को शामिल करने के लिए एक उच्च प्रतिष्ठा नहीं है, इसलिए, यह अभी के लिए एक लिंक है।
यहाँ इस अवधारणा का उपयोग करते हुए एक उदाहरण समारोह का एक संकेत दिया गया है जो थोड़ा और अधिक उन्नत है: https://gist.github.com/scagood/bd99371c072d49a4fee29d193252f5fc#file-matchquotes-js
एक को याद रखना है कि regexps सब कुछ स्ट्रिंग-वाई के लिए एक चांदी की गोली नहीं है। कुछ सामान एक कर्सर और रैखिक, मैनुअल, मांग के साथ करने के लिए सरल हैं। एक सीएफएल चाल को बहुत ही कम करेगा, लेकिन कई सीएफएल कार्यान्वयन (एफएक्यू) नहीं हैं।
Https://stackoverflow.com/a/10786066/1794894 का अधिक व्यापक संस्करण
/"([^"\\]{50,}(\\.[^"\\]*)*)"|\'[^\'\\]{50,}(\\.[^\'\\]*)*\'|“[^”\\]{50,}(\\.[^“\\]*)*”/
इस संस्करण में भी शामिल है
“
और बंद ”
)यदि इसे शुरू से ही खोजा जाए, तो शायद यह काम कर सकता है?
\"((\\\")|[^\\])*\"
मुझे उद्धृत फ़ाइलों को पार्स करने में बाधा हो सकती है जो उद्धृत स्ट्रिंग्स को हटाने की कोशिश कर रहे एक समान समस्या का सामना करना पड़ा।
मैंने दो-चरणीय समाधान के साथ समाप्त किया जो किसी भी जटिल रेगेक्स को धड़कता है जो आप के साथ आ सकते हैं:
line = line.replace("\\\"","\'"); // Replace escaped quotes with something easier to handle
line = line.replaceAll("\"([^\"]*)\"","\"x\""); // Simple is beautiful
पढ़ने में आसान और शायद अधिक कुशल।
यदि आपका IDE IntelliJ Idea है, तो आप इन सभी सिरदर्द को भूल सकते हैं और अपने रेगेक्स को एक स्ट्रिंग चर में स्टोर कर सकते हैं और जैसा कि आप इसे दोहरे-उद्धरण के अंदर कॉपी-पेस्ट करते हैं, यह स्वचालित रूप से एक regex स्वीकार्य प्रारूप में बदल जाएगा।
जावा में उदाहरण:
String s = "\"en_usa\":[^\\,\\}]+";
अब आप अपने चर में या कहीं भी इस चर का उपयोग कर सकते हैं।