उदाहरण के लिए, यह रेगेक्स
(.*)<FooBar>
मैच होगा:
abcde<FooBar>
लेकिन मैं इसे कई लाइनों में कैसे मेल करूँ?
abcde
fghij<FooBar>
उदाहरण के लिए, यह रेगेक्स
(.*)<FooBar>
मैच होगा:
abcde<FooBar>
लेकिन मैं इसे कई लाइनों में कैसे मेल करूँ?
abcde
fghij<FooBar>
जवाबों:
यह भाषा पर निर्भर करता है, लेकिन एक संशोधक होना चाहिए जिसे आप रेगेक्स पैटर्न में जोड़ सकते हैं। PHP में यह है:
/(.*)<FooBar>/s
रों अंत में बिंदु का मिलान करने के लिए कारण बनता है सभी नई-पंक्तियों सहित अक्षर।
s
संशोधक का समर्थन नहीं करता है । इसके बजाय, [^]*
एक ही प्रभाव के लिए करते हैं।
m
इसे इस्तेमाल करे:
((.|\n)*)<FooBar>
यह मूल रूप से "किसी भी चरित्र या एक नई पंक्ति" को शून्य या अधिक बार दोहराया जाता है।
((.|\n|\r)*)<FooBar>
[\s\S]*
या (?s).*
।
सवाल यह है कि क्या .
पैटर्न किसी भी चरित्र से मेल खा सकता है? उत्तर इंजन से इंजन तक भिन्न होता है। मुख्य अंतर यह है कि क्या पैटर्न का उपयोग POSIX या गैर-POSIX regex लाइब्रेरी द्वारा किया जाता है।
के बारे में विशेष ध्यान दें lua-पैटर्न: उन्हें नियमित अभिव्यक्ति नहीं माना जाता है, लेकिन .
वहाँ किसी भी चार्ट से मेल खाता है, जैसे कि POSIX आधारित इंजन।
एक और नोट Matlab तथा सप्टक: .
डिफ़ॉल्ट रूप से किसी भी चार्ट से मेल खाता है ( डेमो) ): str = "abcde\n fghij<Foobar>"; expression = '(.*)<Foobar>*'; [tokens,matches] = regexp(str,expression,'tokens','match');
( tokens
एक abcde\n fghij
आइटम होता है)।
इसके अलावा, सभी में बढ़ावाडिफ़ॉल्ट रूप से डॉट मैच लाइन के टूटने से रेगेक्स व्याकरण होता है। बूस्ट का ECMAScript व्याकरण आपको इसे बंद करने की अनुमति देता है regex_constants::no_mod_m
( स्रोत ) के ।
से संबंधित आकाशवाणी(यह POSIX आधारित है), उपयोग n
विकल्प ( डेमो ):select regexp_substr('abcde' || chr(10) ||' fghij<Foobar>', '(.*)<Foobar>', 1, 1, 'n', 1) as results from dual
POSIX- आधारित इंजन :
एक मात्र .
पहले से ही लाइन ब्रेक से मेल खाता है, किसी भी संशोधक का उपयोग करने की आवश्यकता नहीं है, देखेंदे घुमा के( डेमो )।
tcl( डेमो ),PostgreSQL( डेमो ),आर(TRE, बेस R डिफॉल्ट इंजन विथ नो perl=TRUE
, बेस R फॉर with perl=TRUE
या स्ट्रिंग / स्ट्राई पैटर्न के लिए, (?s)
इनलाइन संशोधक का उपयोग करें ) ( डेमो ) भी .
उसी तरह से व्यवहार करते हैं।
हालाँकि , अधिकांश POSIX आधारित उपकरण लाइन द्वारा इनपुट लाइन की प्रक्रिया करते हैं। इसलिए, .
लाइन टूटने से मेल नहीं खाता है क्योंकि वे दायरे में नहीं हैं। इस ओवरराइड करने के कुछ उदाहरण यहां दिए गए हैं:
sed 'H;1h;$!d;x; s/\(.*\)><Foobar>/\1/'
( H;1h;$!d;x;
फ़ाइल को मेमोरी में खिसकाता है)। यदि पूरी पंक्तियों को शामिल किया जाना चाहिए, sed '/start_pattern/,/end_pattern/d' file
(शुरू से हटाने से मिलान की गई रेखाओं के साथ समाप्त हो जाएगा) या sed '/start_pattern/,/end_pattern/{{//!d;};}' file
(मिलान किए गए लाइनों के साथ) को माना जा सकता है।perl -0pe 's/(.*)<FooBar>/$1/gs' <<< "$str"
( -0
मेमोरी में पूरी फाइल को स्लैप करता है, -p
द्वारा दी गई स्क्रिप्ट को लागू करने के बाद फाइल को प्रिंट करता है -e
)। ध्यान दें कि उपयोग -000pe
करने से फाइल खिसक जाएगी और 'पैराग्राफ मोड' सक्रिय हो जाएगा जहां पर्ल \n\n
रिकॉर्ड विभाजक के रूप में लगातार नईलाइन ( ) का उपयोग करता है ।grep -Poz '(?si)abc\K.*?(?=<Foobar>)' file
। यहाँ, z
फ़ाइल (?s)
स्लैपिंग को सक्षम करता है .
, पैटर्न के लिए DOTALL मोड को सक्षम करता है , (?i)
केस असंवेदनशील मोड को सक्षम करता है, \K
अब तक मेल किए गए टेक्स्ट को छोड़ता है, *?
एक आलसी क्वांटिफायर है, (?=<Foobar>)
जो पहले वाले स्थान से मेल खाता है <Foobar>
।pcregrep -Mi "(?si)abc\K.*?(?=<Foobar>)" file
( M
यहां फाइल को स्लैप करने में सक्षम बनाता है)। नोट pcregrep
मैक ओएस grep
उपयोगकर्ताओं के लिए एक अच्छा समाधान है ।गैर- POSIX- आधारित इंजन :
s
संशोधक PCRE_DOTALL संशोधक का उपयोग करें : preg_match('~(.*)<Foobar>~s', $s, $m)
( डेमो )RegexOptions.Singleline
ध्वज का उपयोग करें ( डेमो ): var result = Regex.Match(s, @"(.*)<Foobar>", RegexOptions.Singleline).Groups[1].Value;
var result = Regex.Match(s, @"(?s)(.*)<Foobar>").Groups[1].Value;
(?s)
इनलाइन विकल्प का उपयोग करें :$s = "abcde`nfghij<FooBar>"; $s -match "(?s)(.*)<Foobar>"; $matches[1]
s
संशोधक का उपयोग करें (या (?s)
शुरुआत में इनलाइन संस्करण) ( डेमो ):/(.*)<FooBar>/s
re.DOTALL
(या re.S
) झंडे या (?s)
इनलाइन संशोधक ( डेमो ): m = re.search(r"(.*)<FooBar>", s, flags=re.S)
(और फिर if m:
, print(m.group(1))
)Pattern.DOTALL
संशोधक (या इनलाइन (?s)
ध्वज) ( डेमो ) का उपयोग करें:Pattern.compile("(.*)<FooBar>", Pattern.DOTALL)
(?s)
इन-पैटर्न संशोधक ( डेमो ) का उपयोग करें :regex = /(?s)(.*)<FooBar>/
(?s)
संशोधक ( डेमो ) का उपयोग करें :"(?s)(.*)<Foobar>".r.findAllIn("abcde\n fghij<Foobar>").matchData foreach { m => println(m.group(1)) }
[^]
या workarounds [\d\D]
/ [\w\W]
/ [\s\S]
( डेमो ):s.match(/([\s\S]*)<FooBar>/)[1]
std::regex
) का उपयोग करें [\s\S]
या जेएस workarounds ( डेमो ):regex rex(R"(([\s\S]*)<FooBar>)");
VBA VBScript-, जावास्क्रिप्ट में के रूप में ही दृष्टिकोण का उपयोग करें ([\s\S]*)<Foobar>
। ( नोट : ऑब्जेक्ट की MultiLine
संपत्ति
RegExp
को कभी-कभी गलती से .
लाइन ब्रेक के पार मैच की अनुमति देने का विकल्प माना जाता है, जबकि, वास्तव में, यह केवल स्ट्रिंग्स के बजाय लाइनों के प्रारंभ / अंत से मेल खाने के लिए व्यवहार ^
और $
व्यवहार को बदलता है , जेएस रेगेक्स की तरह ) व्यवहार।)
माणिक- /m
MULTILINE संशोधक ( डेमो ) का उपयोग करें :s[/(.*)<Foobar>/m, 1]
(?s)
: regmatches(x, regexec("(?s)(.*)<FooBar>",x, perl=TRUE))[[1]][2]
( डेमो )stringr
/ stringi
regex funtions कि ICU regex इंजन के साथ संचालित कर रहे हैं, भी उपयोग करें (?s)
: stringr::str_match(x, "(?s)(.*)<FooBar>")[,2]
( डेमो )(?s)
प्रारंभ ( डेमो ) में इनलाइन संशोधक का उपयोग करें :re: = regexp.MustCompile(`(?s)(.*)<FooBar>`)
dotMatchesLineSeparators
या (आसान) (?s)
पैटर्न के लिए इनलाइन संशोधक पास :let rx = "(?s)(.*)<Foobar>"
(?s)
सबसे आसान काम करता है, लेकिन यहां बताया गया है कि विकल्प का उपयोग कैसे किया जा सकता है :NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:pattern
options:NSRegularExpressionDotMatchesLineSeparators error:®exError];
(?s)
संशोधक का उपयोग करें ( डेमो ): "(?s)(.*)<Foobar>"
(Google स्प्रेडशीट में =REGEXEXTRACT(A2,"(?s)(.*)<Foobar>")
)नोट(?s)
:
अधिकांश गैर-पोसिक्स इंजनों में, (?s)
इनलाइन संशोधक (या एम्बेडेड फ्लैग विकल्प) का उपयोग .
लाइन ब्रेक से मेल खाने के लिए किया जा सकता है।
यदि पैटर्न की शुरुआत में रखा जाता है, तो पैटर्न (?s)
में सभी के व्यवहार को बदल देता है .
। यदि (?s)
शुरुआत के बाद कहीं रखा गया है, तो केवल वे ही .
प्रभावित होंगे जो इसके दाईं ओर स्थित हैं जब तक कि यह पायथन के लिए पारित एक पैटर्न नहीं है re
। पायथन में re
, (?s)
स्थान की परवाह किए बिना , पूरे पैटर्न .
प्रभावित होते हैं। (?s)
प्रभाव का उपयोग बंद कर दिया है (?-s)
। एक संशोधित समूह का उपयोग केवल रेगेक्स पैटर्न की एक निर्दिष्ट सीमा को प्रभावित करने के लिए किया जा सकता है (उदाहरण के Delim1(?s:.*?)\nDelim2.*
लिए नए .*?
सिरे से पहला मैच .*
होगा और दूसरा केवल शेष पंक्ति से मेल खाएगा)।
पोसिक्स नोट :
गैर-पोसिक्स रेगेक्स इंजन में, किसी भी चार्ट से मेल खाने के लिए, [\s\S]
/ [\d\D]
/ [\w\W]
कंस्ट्रक्शन का उपयोग किया जा सकता है।
POSIX में, [\s\S]
किसी भी char (जावास्क्रिप्ट या किसी गैर-POSIX इंजन के रूप में) से मेल नहीं खा रहा है क्योंकि regex से बचना क्रम ब्रैकेट के भावों के अंदर समर्थित नहीं है। [\s\S]
ब्रैकेट भाव है कि एक एकल चार, से मेल के रूप में पार्स किया गया है \
या s
या S
।
#define MOD regex_constants::perl | boost::regex::no_mod_s | boost::regex::no_mod_m
बात को दर्शाने के लिए किन्हीं रेगेक्स फ्लैग के लिए बेस फ्लैग परिभाषा निर्धारित करेंगे । और आर्बिटर हमेशा इनलाइन संशोधक होता है। कहाँ रहता है (?-sm)(?s).*
।
.
किसी भी चार्ट से मेल खाता है (लाइन ब्रेक सहित)। यह ऑनलाइन बैश डेमो देखें ।
Go
उत्तर में शामिल करने के लिए यश और अतिरिक्त वोट !
यदि आप ग्रहण खोज का उपयोग कर रहे हैं, तो आप "DOTALL" विकल्प को '' बनाने में सक्षम कर सकते हैं। ' रेखा परिसीमाओं सहित किसी भी वर्ण का मिलान करें: अपनी खोज स्ट्रिंग की शुरुआत में बस "(? s)" जोड़ें। उदाहरण:
(?s).*<FooBar>
(?s)
(?m)
कई रेगेक्स बोलियों में, /[\S\s]*<Foobar>/
आप जो चाहते हैं, वैसा ही करेंगे। स्रोत
([\s\S]*)<FooBar>
डॉट सभी newlines (\ r \ n) को छोड़कर सभी से मेल खाता है। तो \ _ \ _ का उपयोग करें, जो सभी वर्णों से मेल खाएगा।
[text rangeOfString:regEx options:NSRegularExpressionSearch]
। धन्यवाद!
<FooBar>
में रूबी माणिकआप ' m
' विकल्प (बहुस्तरीय) का उपयोग कर सकते हैं :
/YOUR_REGEXP/m
देखें Regexp प्रलेखन अधिक जानकारी के लिए ruby-doc.org पर।
हम भी उपयोग कर सकते हैं
(.*?\n)*?
लालच के बिना newline सहित सब कुछ मैच के लिए
यह नई लाइन को वैकल्पिक बनाएगा
(.*?|\n)*?
"."
आम तौर पर लाइन-ब्रेक से मेल नहीं खाता। अधिकांश रेगेक्स इंजन आपको S
नई सुर्खियों में लाने के लिए -flag (जिसे भी कहते हैं DOTALL
और SINGLELINE
) जोड़ते हैं "."
। यदि वह विफल रहता है, तो आप कुछ ऐसा कर सकते हैं [\S\s]
।
/(.*)<FooBar>/s
s गाड़ी के रिटर्न का मिलान करने के लिए डॉट (।) का कारण बनता है
s
झंडे, सबसे पूर्ण इंजन (पर्ल और PHP में उपलब्ध) PCRE में मौजूद है। PCRE में 10 झंडे (और अन्य बहुत सारी सुविधाएँ) हैं, जबकि जावास्क्रिप्ट में केवल 3 झंडे ( gmi
) हैं।
जावा आधारित नियमित अभिव्यक्ति में आप उपयोग कर सकते हैं [\s\S]
s
जावा और पैटर्न में ध्वज को जोड़ सकते हैं, इसलिए ध्वज में ध्वज नहीं है s
।
ध्यान दें कि (.|\n)*
(उदाहरण के लिए) की तुलना में कम कुशल हो सकता है [\s\S]*
(यदि आपकी भाषा की रीगेक्स इस तरह के पलायन का समर्थन करती है) और उस संशोधक को निर्दिष्ट करने के तरीके को खोजने से अधिक है जो बनाता है। नई कहानियों से भी मेल खाते हैं। या आप जैसे POSIXy विकल्प के साथ जा सकते हैं [[:space:][:^space:]]*
।
उपयोग करें पैटर्न संशोधक एसयू को पीएचपी में वांछित मिलान मिलेगा।
preg_match('/(.*)/sU',$content,$match);
http://dreamluverz.com/developers-tools/regex-match-all-including-new-line http://php.net/manual/en/reference.pcre.pattern.modifiers.php
भाषाओं के भीतर उपयोग के संदर्भ में, नियमित अभिव्यक्तियाँ तार पर कार्य करती हैं, रेखाओं पर नहीं। तो आपको सामान्य रूप से रेगेक्स का उपयोग करने में सक्षम होना चाहिए, यह मानते हुए कि इनपुट स्ट्रिंग में कई लाइनें हैं।
इस मामले में, दिए गए रेगेक्स पूरे स्ट्रिंग से मेल खाएंगे, क्योंकि "<FooBar>" मौजूद है। रेगेक्स कार्यान्वयन की बारीकियों के आधार पर, $ 1 मूल्य ("(*। *)" से प्राप्त) या तो "fghij" या "abcde \ nfghij" होगा। जैसा कि दूसरों ने कहा है, कुछ कार्यान्वयन आपको नियंत्रित करने की अनुमति देते हैं कि क्या "।" आपको पसंद करते हुए, नई लाइन से मेल खाएगा।
लाइन-आधारित नियमित अभिव्यक्ति का उपयोग आमतौर पर कमांड लाइन की चीजों के लिए होता है, जैसे कि एग्रेप।
मेरे पास एक ही समस्या थी और इसे शायद सबसे अच्छे तरीके से हल नहीं किया गया लेकिन यह काम करता है। अपना असली मैच करने से पहले मैंने सभी लाइन ब्रेक बदल दिए:
mystring= Regex.Replace(mystring, "\r\n", "")
मैं HTML में हेरफेर कर रहा हूं इसलिए इस मामले में लाइन ब्रेक वास्तव में मेरे लिए कोई मायने नहीं रखता है।
मैंने उपरोक्त सभी सुझावों को बिना किसी भाग्य के आज़माया, मैं .net 3.5 FYI का उपयोग कर रहा हूँ
(\s|\S)
मेरे लिए चाल करने के लिए लगता है!
(?s)
करने के लिए उपयोग करें .
। उपयोग न करें (\s|\S)
जो प्रदर्शन को धीमा कर देगा।
जावास्क्रिप्ट में आप [^] * का उपयोग कर सकते हैं शून्य से अनंत वर्णों की खोज के लिए, जिसमें लाइन ब्रेक भी शामिल है।
$("#find_and_replace").click(function() {
var text = $("#textarea").val();
search_term = new RegExp("[^]*<Foobar>", "gi");;
replace_term = "Replacement term";
var new_text = text.replace(search_term, replace_term);
$("#textarea").val(new_text);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="find_and_replace">Find and replace</button>
<br>
<textarea ID="textarea">abcde
fghij<Foobar></textarea>
आम तौर पर । नई सूचियों से मेल नहीं खाता, इसलिए प्रयास करें((.|\n)*)<foobar>
\r
।:((?:.|\r?\n)*)<foobar>
मैं एक विशेष मैच अगर जावा में ब्लॉक करना चाहता था
...
...
if(isTrue){
doAction();
}
...
...
}
अगर मैं regExp का उपयोग करता हूं
if \(isTrue(.|\n)*}
इसमें विधि ब्लॉक के लिए समापन ब्रेस शामिल था, इसलिए मैंने इसका उपयोग किया
if \(!isTrue([^}.]|\n)*}
वाइल्डकार्ड मैच से समापन ब्रेस को बाहर करने के लिए।
अक्सर हम सबरिंग से पहले की पंक्तियों में फैले कुछ कीवर्ड के साथ एक विकल्प को संशोधित करते हैं। एक xml तत्व पर विचार करें:
<TASK>
<UID>21</UID>
<Name>Architectural design</Name>
<PercentComplete>81</PercentComplete>
</TASK>
मान लीजिए कि हमें 81 संशोधित करना चाहते हैं, कुछ अन्य मूल्य के लिए कहते हैं, 40. पहली पहचान .UID.21..UID.
है, तो सहित सभी वर्ण छोड़ \n
तक .PercentCompleted.
। नियमित अभिव्यक्ति पैटर्न और प्रतिस्थापित विनिर्देश हैं:
String hw = new String("<TASK>\n <UID>21</UID>\n <Name>Architectural design</Name>\n <PercentComplete>81</PercentComplete>\n</TASK>");
String pattern = new String ("(<UID>21</UID>)((.|\n)*?)(<PercentComplete>)(\\d+)(</PercentComplete>)");
String replaceSpec = new String ("$1$2$440$6");
//note that the group (<PercentComplete>) is $4 and the group ((.|\n)*?) is $2.
String iw = hw.replaceFirst(pattern, replaceSpec);
System.out.println(iw);
<TASK>
<UID>21</UID>
<Name>Architectural design</Name>
<PercentComplete>40</PercentComplete>
</TASK>
उपसमूह (.|\n)
शायद लापता समूह है $3
। यदि हम इसे गैर-कैप्चरिंग बनाते हैं (?:.|\n)
तो यह $3
है (<PercentComplete>)
। तो पैटर्न और replaceSpec
भी हो सकता है:
pattern = new String("(<UID>21</UID>)((?:.|\n)*?)(<PercentComplete>)(\\d+)(</PercentComplete>)");
replaceSpec = new String("$1$2$340$5")
और प्रतिस्थापन पहले की तरह सही ढंग से काम करता है।
आमतौर पर पॉवर्सशेल में लगातार तीन लाइनों को खोजने से ऐसा लगेगा:
$file = get-content file.txt -raw
$pattern = 'lineone\r\nlinetwo\r\nlinethree\r\n' # "windows" text
$pattern = 'lineone\nlinetwo\nlinethree\n' # "unix" text
$pattern = 'lineone\r?\nlinetwo\r?\nlinethree\r?\n' # both
$file -match $pattern
# output
True
विचित्र रूप से, यह प्रॉम्प्ट पर यूनिक्स टेक्स्ट होगा, लेकिन एक फाइल में विंडोज़ टेक्स्ट:
$pattern = 'lineone
linetwo
linethree
'
यहां लाइन एंडिंग को प्रिंट करने का एक तरीका है:
'lineone
linetwo
linethree
' -replace "`r",'\r' -replace "`n",'\n'
# output
lineone\nlinetwo\nlinethree\n
s
ध्वज का उपयोग करने का एक तरीका होगा (स्वीकृत उत्तर की तरह):
/(.*)<FooBar>/s
दूसरा तरीका यह होगा कि m
(बहुस्तरीय) झंडे और निम्न में से किसी भी एक पैटर्न का उपयोग किया जाए:
/([\s\S]*)<FooBar>/m
या
/([\d\D]*)<FooBar>/m
या
/([\w\W]*)<FooBar>/m
jex.im नियमित अभिव्यक्ति की कल्पना करता है: