मैं किसी भी वर्ण को एक नियमित अभिव्यक्ति में कई लाइनों से कैसे मेल कर सकता हूं?


355

उदाहरण के लिए, यह रेगेक्स

(.*)<FooBar>

मैच होगा:

abcde<FooBar>

लेकिन मैं इसे कई लाइनों में कैसे मेल करूँ?

abcde
fghij<FooBar>

1
स्पष्टीकरण देना; मैं मूल रूप से एक्लिप्स का उपयोग कर रहा था कि वह कई फाइलों को ढूंढे और बदले। नीचे दिए गए उत्तरों से मुझे पता चला है कि मेरी समस्या टूल थी न कि रेगेक्स पैटर्न।
andyuk

2
आपका ध्वज "ग्रहण" हटा दिया जाना चाहिए क्योंकि एक ग्रहण समाधान की तलाश करने वाले को यह प्रश्न मिलेगा (जैसे मैंने किया था) और फिर एक ग्रहण किए गए समाधान को स्वीकार करें।
acme

2
अब मैं इसे खोज इंजन में खोज रहा हूं क्योंकि ग्रहण का उल्लेख किया गया था। ओह हॉरर।
ब्रायन ऑलसेन

जवाबों:


240

यह भाषा पर निर्भर करता है, लेकिन एक संशोधक होना चाहिए जिसे आप रेगेक्स पैटर्न में जोड़ सकते हैं। PHP में यह है:

/(.*)<FooBar>/s

रों अंत में बिंदु का मिलान करने के लिए कारण बनता है सभी नई-पंक्तियों सहित अक्षर।


और क्या होगा अगर मैं सिर्फ एक नई पंक्ति और सभी वर्ण नहीं चाहता था ?
ग्रेस

3
@ ग्रेस: ​​उपयोग करने के लिए एक नई
रेखा

5
कम से कम क्रोम / V8 में ध्वज (अब?) अमान्य है। इसके बजाय / ([\ s \ S] *) <FooBar> / character class (मैच स्पेस और नॉन-स्पेस) को पीरियड मैचर के बजाय देखें। अधिक जानकारी के लिए अन्य उत्तर देखें।
Allen

8
@ एलेन - जावास्क्रिप्ट sसंशोधक का समर्थन नहीं करता है । इसके बजाय, [^]*एक ही प्रभाव के लिए करते हैं।
डेरेक 會 會 k

1
रूबी में, m
रयान बकले

355

इसे इस्तेमाल करे:

((.|\n)*)<FooBar>

यह मूल रूप से "किसी भी चरित्र या एक नई पंक्ति" को शून्य या अधिक बार दोहराया जाता है।


5
यह उस भाषा और / या उपकरण पर निर्भर है जिसका आप उपयोग कर रहे हैं। कृपया हमें बताएं कि आप क्या उपयोग कर रहे हैं, उदाहरण के लिए पर्ल, पीएचपी, सीएफ, सी #, sed, awk, आदि
बेन डूम

39
आपके लाइन एंडिंग के आधार पर आपको आवश्यकता हो सकती है((.|\n|\r)*)<FooBar>
पर्ट्का

3
उन्होंने कहा कि वह ग्रहण का उपयोग कर रहे हैं। यह मेरी राय में सही समाधान है। मुझे एक ही समस्या है और इसने इसे हल किया।
दानूबियन नाविक

4
अधिकार - सवाल ग्रहण के बारे में है और इसलिए टैग हैं। लेकिन स्वीकृत समाधान एक PHP समाधान है। तुम्हारा होना चाहिए स्वीकृत समाधान ...
acme

16
मल्टीपल लाइन इनपुट के मिलान के लिए यह सबसे खराब rexx है। जब तक आप ElasticSearch का उपयोग नहीं कर रहे हैं, कृपया इसका उपयोग कभी न करें। का प्रयोग करें [\s\S]*या (?s).*
विकटोरिया Stribiżew

88

सवाल यह है कि क्या .पैटर्न किसी भी चरित्र से मेल खा सकता है? उत्तर इंजन से इंजन तक भिन्न होता है। मुख्य अंतर यह है कि क्या पैटर्न का उपयोग POSIX या गैर-POSIX regex लाइब्रेरी द्वारा किया जाता है।

के बारे में विशेष ध्यान दें : उन्हें नियमित अभिव्यक्ति नहीं माना जाता है, लेकिन .वहाँ किसी भी चार्ट से मेल खाता है, जैसे कि POSIX आधारित इंजन।

एक और नोट तथा : .डिफ़ॉल्ट रूप से किसी भी चार्ट से मेल खाता है ( डेमो) ): 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- आधारित इंजन :

एक मात्र . पहले से ही लाइन ब्रेक से मेल खाता है, किसी भी संशोधक का उपयोग करने की आवश्यकता नहीं है, देखें( डेमो )।

( डेमो ),( डेमो ),(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>)");
  • -, जावास्क्रिप्ट में के रूप में ही दृष्टिकोण का उपयोग करें ([\s\S]*)<Foobar>। ( नोट : ऑब्जेक्ट की MultiLineसंपत्ति RegExpको कभी-कभी गलती से .लाइन ब्रेक के पार मैच की अनुमति देने का विकल्प माना जाता है, जबकि, वास्तव में, यह केवल स्ट्रिंग्स के बजाय लाइनों के प्रारंभ / अंत से मेल खाने के लिए व्यवहार ^और $व्यवहार को बदलता है , जेएस रेगेक्स की तरह ) व्यवहार।)

  • - /m MULTILINE संशोधक ( डेमो ) का उपयोग करें :s[/(.*)<Foobar>/m, 1]

  • - बेस आर PCRE regexps - उपयोग (?s): regmatches(x, regexec("(?s)(.*)<FooBar>",x, perl=TRUE))[[1]][2]( डेमो )
  • - में stringr/ stringiregex 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:&regexError];
  • , - (?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


5
आपको अपने प्रोफ़ाइल पृष्ठ या कुछ (+1) से इस उत्कृष्ट अवलोकन से लिंक करना चाहिए।
जनवरी

1
आप इसे बूस्ट आइटम में जोड़ना चाह सकते हैं : regex_constants नामस्थान में, flag_type_'s: perl = ECMAScript = JavaScript = JScript = :: boost :: regbase :: normal = 0 जो पर्ल के साथ दोष करता है। प्रोग्रामर इस #define MOD regex_constants::perl | boost::regex::no_mod_s | boost::regex::no_mod_mबात को दर्शाने के लिए किन्हीं रेगेक्स फ्लैग के लिए बेस फ्लैग परिभाषा निर्धारित करेंगे । और आर्बिटर हमेशा इनलाइन संशोधक होता है। कहाँ रहता है (?-sm)(?s).*

1
क्या आप कृपया बैश के लिए भी जोड़ सकते हैं?
पसुपति राजमनिकम

2
@PasupathiRajamanickam बैश POSIX regex इंजन का उपयोग करता है, .किसी भी चार्ट से मेल खाता है (लाइन ब्रेक सहित)। यह ऑनलाइन बैश डेमो देखें ।
विकटोरिया स्ट्राइब्यू

1
आप रॉक - यह (अपेक्षाकृत) जटिल regexp पर सबसे अधिक थकाऊ मिनी-ट्यूटोरियल है जो मैंने कभी देखा है। आप इस लायक हैं कि आपका उत्तर स्वीकार किया जाता है! Goउत्तर में शामिल करने के लिए यश और अतिरिक्त वोट !
ग्वेनेथ लेलेवेन

68

यदि आप ग्रहण खोज का उपयोग कर रहे हैं, तो आप "DOTALL" विकल्प को '' बनाने में सक्षम कर सकते हैं। ' रेखा परिसीमाओं सहित किसी भी वर्ण का मिलान करें: अपनी खोज स्ट्रिंग की शुरुआत में बस "(? s)" जोड़ें। उदाहरण:

(?s).*<FooBar>

1
कहीं भी नहीं, केवल रेगेक्स फ्लेवर में इनलाइन (?s)(?m)
मॉडिफ़ायर्स का

बैश के लिए कुछ भी?
पसुपति राजमनिकम

38

कई रेगेक्स बोलियों में, /[\S\s]*<Foobar>/आप जो चाहते हैं, वैसा ही करेंगे। स्रोत


2
उस लिंक से: "जावास्क्रिप्ट और वीबीएसस्क्रिप्ट के पास डॉट मैच लाइन ब्रेक कैरेक्टर बनाने का विकल्प नहीं है। उन भाषाओं में, आप किसी भी वर्ण से मेल खाने के लिए एक चरित्र वर्ग जैसे [\ _ s] का उपयोग कर सकते हैं।" के स्थान पर । इसके बजाय [\ s \ S] (रिक्त स्थान और गैर-रिक्त स्थान) का उपयोग करें।
एलन

32

([\s\S]*)<FooBar>

डॉट सभी newlines (\ r \ n) को छोड़कर सभी से मेल खाता है। तो \ _ \ _ का उपयोग करें, जो सभी वर्णों से मेल खाएगा।


यदि आप ऑब्जेक्टिव-सी का उपयोग कर रहे हैं तो यह समस्या का समाधान करता है [text rangeOfString:regEx options:NSRegularExpressionSearch]। धन्यवाद!
जे। कोस्टा

1
यह इंटेलीजेंस के रीजैक्स को बदलने और बदलने में काम करता है, धन्यवाद।
बारक्ले

यह काम। लेकिन इसके लिए पहली घटना होने की आवश्यकता है<FooBar>
ओज़कान


13

हम भी उपयोग कर सकते हैं

(.*?\n)*?

लालच के बिना newline सहित सब कुछ मैच के लिए

यह नई लाइन को वैकल्पिक बनाएगा

(.*?|\n)*?

8

"."आम तौर पर लाइन-ब्रेक से मेल नहीं खाता। अधिकांश रेगेक्स इंजन आपको Sनई सुर्खियों में लाने के लिए -flag (जिसे भी कहते हैं DOTALLऔर SINGLELINE) जोड़ते हैं "."। यदि वह विफल रहता है, तो आप कुछ ऐसा कर सकते हैं [\S\s]


8

ग्रहण के लिए निम्नलिखित अभिव्यक्ति काम की है:

फू

जडजादा बार "

नियमित अभिव्यक्ति:

Foo[\S\s]{1,10}.*Bar*

5
/(.*)<FooBar>/s

s गाड़ी के रिटर्न का मिलान करने के लिए डॉट (।) का कारण बनता है


ऐसा लगता है कि यह अमान्य है (Chrome): text.match (/ a / s) SyntaxError: RegExp कंस्ट्रक्टर के 's' को दिए गए अवैध झंडे
Allen

क्योंकि यह जावास्क्रिप्ट RegEx इंजन में असमर्थित है। sझंडे, सबसे पूर्ण इंजन (पर्ल और PHP में उपलब्ध) PCRE में मौजूद है। PCRE में 10 झंडे (और अन्य बहुत सारी सुविधाएँ) हैं, जबकि जावास्क्रिप्ट में केवल 3 झंडे ( gmi) हैं।
मॉर्गन टोवरे क्विलिंग

4

जावा आधारित नियमित अभिव्यक्ति में आप उपयोग कर सकते हैं [\s\S]


1
उन backslashes नहीं होना चाहिए?
पॉल ड्रेपर

वे नियमित अभिव्यक्ति के अंत में जाते हैं, भीतर नहीं। उदाहरण: / blah / s
randomInsano

मुझे लगता है कि आप जावास्क्रिप्ट का मतलब है, जावा नहीं? चूंकि आप केवल sजावा और पैटर्न में ध्वज को जोड़ सकते हैं, इसलिए ध्वज में ध्वज नहीं है s
3limin4t0r

3

ध्यान दें कि (.|\n)*(उदाहरण के लिए) की तुलना में कम कुशल हो सकता है [\s\S]*(यदि आपकी भाषा की रीगेक्स इस तरह के पलायन का समर्थन करती है) और उस संशोधक को निर्दिष्ट करने के तरीके को खोजने से अधिक है जो बनाता है। नई कहानियों से भी मेल खाते हैं। या आप जैसे POSIXy विकल्प के साथ जा सकते हैं [[:space:][:^space:]]*


3

RegexOptions.Singleline का उपयोग करें, इसका अर्थ बदल जाता है। newlines शामिल करने के लिए

Regex.Replace (कंटेंट, सर्चटेक्स्ट, रिप्लेसटेक्स्ट, रेगेक्सऑक्शंस.सिंगललाइन);



1

भाषाओं के भीतर उपयोग के संदर्भ में, नियमित अभिव्यक्तियाँ तार पर कार्य करती हैं, रेखाओं पर नहीं। तो आपको सामान्य रूप से रेगेक्स का उपयोग करने में सक्षम होना चाहिए, यह मानते हुए कि इनपुट स्ट्रिंग में कई लाइनें हैं।

इस मामले में, दिए गए रेगेक्स पूरे स्ट्रिंग से मेल खाएंगे, क्योंकि "<FooBar>" मौजूद है। रेगेक्स कार्यान्वयन की बारीकियों के आधार पर, $ 1 मूल्य ("(*। *)" से प्राप्त) या तो "fghij" या "abcde \ nfghij" होगा। जैसा कि दूसरों ने कहा है, कुछ कार्यान्वयन आपको नियंत्रित करने की अनुमति देते हैं कि क्या "।" आपको पसंद करते हुए, नई लाइन से मेल खाएगा।

लाइन-आधारित नियमित अभिव्यक्ति का उपयोग आमतौर पर कमांड लाइन की चीजों के लिए होता है, जैसे कि एग्रेप।


1

मेरे पास एक ही समस्या थी और इसे शायद सबसे अच्छे तरीके से हल नहीं किया गया लेकिन यह काम करता है। अपना असली मैच करने से पहले मैंने सभी लाइन ब्रेक बदल दिए:

mystring= Regex.Replace(mystring, "\r\n", "")

मैं HTML में हेरफेर कर रहा हूं इसलिए इस मामले में लाइन ब्रेक वास्तव में मेरे लिए कोई मायने नहीं रखता है।

मैंने उपरोक्त सभी सुझावों को बिना किसी भाग्य के आज़माया, मैं .net 3.5 FYI का उपयोग कर रहा हूँ


मैं भी .NET का उपयोग कर रहा हूँ और (\s|\S)मेरे लिए चाल करने के लिए लगता है!
वामशी कृष्ण

@VamshiKrishna .NET में, किसी भी चार्ट से मिलान (?s)करने के लिए उपयोग करें .। उपयोग न करें (\s|\S)जो प्रदर्शन को धीमा कर देगा।
विकटोरिया स्ट्राइब्यू

1

जावास्क्रिप्ट में आप [^] * का उपयोग कर सकते हैं शून्य से अनंत वर्णों की खोज के लिए, जिसमें लाइन ब्रेक भी शामिल है।

$("#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&lt;Foobar&gt;</textarea>


0

आम तौर पर । नई सूचियों से मेल नहीं खाता, इसलिए प्रयास करें((.|\n)*)<foobar>


3
नहीं, ऐसा मत करो। यदि आपको लाइन सेपरेटर सहित किसी भी चीज़ से मेल खाना है, तो DOTALL (उर्फ / एस या सिंगललाइन) संशोधक का उपयोग करें। न केवल (। | \ N) हैक regex को कम कुशल बनाता है, यह सही भी नहीं है। बहुत कम से कम, यह \ r (गाड़ी वापसी) के साथ-साथ \ n (लाइनफीड) से मेल खाना चाहिए। अन्य लाइन विभाजक वर्ण भी हैं, हालांकि, शायद ही कभी इस्तेमाल किया जाता है। लेकिन अगर आप DOTALL ध्वज का उपयोग करते हैं, तो आपको उनके बारे में चिंता करने की आवश्यकता नहीं है।
एलन मूर

1
ग्रहण में newlines के लिए \ R प्लेटफ़ॉर्म-स्वतंत्र मैच है।
opyate

@ चटकाना आपको इसे उत्तर के रूप में पोस्ट करना चाहिए क्योंकि यह छोटा रत्न अविश्वसनीय रूप से उपयोगी है।
jeckhart

आप इसके बजाय यह कोशिश कर सकते हैं। यह आंतरिक कोष्ठक से मेल नहीं खाएगा और वैकल्पिक पर भी विचार करेगा \r।:((?:.|\r?\n)*)<foobar>
ssc-hrep3

0

मैं एक विशेष मैच अगर जावा में ब्लॉक करना चाहता था

   ...
   ...
   if(isTrue){
       doAction();

   }
...
...
}

अगर मैं regExp का उपयोग करता हूं

if \(isTrue(.|\n)*}

इसमें विधि ब्लॉक के लिए समापन ब्रेस शामिल था, इसलिए मैंने इसका उपयोग किया

if \(!isTrue([^}.]|\n)*}

वाइल्डकार्ड मैच से समापन ब्रेस को बाहर करने के लिए।


0

अक्सर हम सबरिंग से पहले की पंक्तियों में फैले कुछ कीवर्ड के साथ एक विकल्प को संशोधित करते हैं। एक 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")

और प्रतिस्थापन पहले की तरह सही ढंग से काम करता है।


0

आमतौर पर पॉवर्सशेल में लगातार तीन लाइनों को खोजने से ऐसा लगेगा:

$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

-2

विकल्प 1

sध्वज का उपयोग करने का एक तरीका होगा (स्वीकृत उत्तर की तरह):

/(.*)<FooBar>/s

डेमो 1

विकल्प 2

दूसरा तरीका यह होगा कि m(बहुस्तरीय) झंडे और निम्न में से किसी भी एक पैटर्न का उपयोग किया जाए:

/([\s\S]*)<FooBar>/m

या

/([\d\D]*)<FooBar>/m

या

/([\w\W]*)<FooBar>/m

डेमो 2

RegEx सर्किट

jex.im नियमित अभिव्यक्ति की कल्पना करता है:

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.