আমি কীভাবে কোনও নিয়মিত অভিব্যক্তিতে একাধিক লাইন জুড়ে কোনও চরিত্রের সাথে মিল করব?


355

উদাহরণস্বরূপ, এই regex

(.*)<FooBar>

মিলবে:

abcde<FooBar>

তবে আমি কীভাবে এটি একাধিক লাইন জুড়ে মেলাতে পারি?

abcde
fghij<FooBar>

1
স্পষ্ট করা; আমি মূলত একাধিক ফাইলে অনুসন্ধান এবং প্রতিস্থাপনের জন্য Eclipse ব্যবহার করছিলাম। নীচের উত্তরগুলি দ্বারা আমি যা আবিষ্কার করেছি তা হ'ল আমার সমস্যাটি হাতিয়ার ছিল এবং রেজেক্স প্যাটার্ন নয়।
andyuk

2
তারপরে আপনার পতাকা "গ্রহণ "সরিয়ে ফেলা উচিত কারণ একটি গ্রহ সমাধানের সন্ধানের জন্য এই প্রশ্নটি (যেমনটি আমি করেছি) সন্ধান করবে এবং তারপরে গ্রহণযোগ্য হিসাবে একটি অ-গ্রহণের সমাধান খুঁজে পাবে।
acme

2
এখন আমি এটি অনুসন্ধান ইঞ্জিনে খুঁজে পাচ্ছি কারণ গ্রহণের কথা উল্লেখ করা হয়েছিল। ওরে হরর।
ব্রায়ান ওলসেন

উত্তর:


240

এটি ভাষার উপর নির্ভর করে, তবে এমন একটি সংশোধক থাকতে হবে যা আপনি রেজেক্স প্যাটার্নে যুক্ত করতে পারেন। পিএইচপি তে এটি:

/(.*)<FooBar>/s

গুলি শেষে ডট মেলে ঘটায় সব নতুন লাইন সহ অক্ষর।


এবং যদি আমি কেবল একটি নতুন লাইন চাই এবং সমস্ত চরিত্র না?
গ্রেস

3
@ গ্রেস: একটি নতুন লাইনের সাথে মেলে \ n ব্যবহার করুন
জেরেমি রুটেন

5
এর পতাকাটি (এখন?) অবৈধ, কমপক্ষে Chrome / V8 এ রয়েছে। পিরিয়ড ম্যাচারের পরিবর্তে / ([\ s \ S] *) <FooBar> / অক্ষর শ্রেণি (ম্যাচ স্পেস এবং অ স্পেস] ব্যবহার করুন। আরও তথ্যের জন্য অন্যান্য উত্তর দেখুন
অ্যালেন

8
@ অ্যালেন - জাভাস্ক্রিপ্ট পরিবর্তনকারীটিকে সমর্থন করে না s। পরিবর্তে, [^]*একই প্রভাব জন্য না।
ডেরেক 朕 會 功夫

1
রুবিতে, mসংশোধকটি ব্যবহার করুন
রায়ান বাকলি

355

এটা চেষ্টা কর:

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

এটি মূলত "যে কোনও চরিত্র বা একটি নতুন লাইন" পুনরাবৃত্তি শূন্য বা তার বেশি বার বলে।


5
এটি আপনি যে ভাষা এবং / বা সরঞ্জামটি ব্যবহার করছেন তার উপর নির্ভরশীল। দয়া করে আমাদের জানান কি আপনি ব্যবহার করছেন, যেমন পার্ল, পিএইচপি, সিএফ, সি #, কিন্তু, awk, ইত্যাদি দিন
বেন নিয়তি

39
আপনার লাইন শেষের উপর নির্ভর করে আপনার প্রয়োজন হতে পারে((.|\n|\r)*)<FooBar>
পুথেরকা

3
তিনি বলেছেন যে তিনি গ্রহনটি ব্যবহার করছেন। এটি আমার মতে সঠিক সমাধান। আমার একই সমস্যা আছে এবং এটি এটি সমাধান করেছে।
ডানুবিয়ান নাবিক

4
ডান - প্রশ্নটি গ্রহন সম্পর্কে এবং তেমন ট্যাগগুলিও। তবে গৃহীত সমাধানটি পিএইচপি সমাধান। ইতি গৃহীত সমাধান হওয়া উচিত ...
চূড়া

16
এটি একাধিক লাইন ইনপুটটির সাথে মিলে যাওয়ার জন্য সবচেয়ে খারাপ রেজেক্স। আপনি যদি ইলাস্টিক অনুসন্ধান না ব্যবহার করেন তবে দয়া করে কখনই এটি ব্যবহার করবেন না। ব্যবহার করুন [\s\S]*বা (?s).*
উইক্টর স্ট্রিবিউউ

88

প্রশ্ন হলো, যায় .প্যাটার্ন মেলে কোন চরিত্রের সাথে কী ? উত্তর ইঞ্জিন থেকে ইঞ্জিনে পরিবর্তিত হয়। মূল পার্থক্যটি হ'ল প্যাটার্নটি কোনও পসিক্স বা নন-পসিক্স রেইজেক্স লাইব্রেরি দ্বারা ব্যবহৃত হয়।

সম্পর্কে বিশেষ নোট : এগুলিকে নিয়মিত অভিব্যক্তি হিসাবে বিবেচনা করা হয় না, তবে .সেখানে পসিক্স ভিত্তিক ইঞ্জিনগুলির মতো কোনও চরিত্রের সাথে মেলে।

আরেকটি নোট অন এবং : .ডিফল্ট ( ডেমো ) দ্বারা যে কোনও চরকে মেলে : str = "abcde\n fghij<Foobar>"; expression = '(.*)<Foobar>*'; [tokens,matches] = regexp(str,expression,'tokens','match');( tokensএকটি abcde\n fghijআইটেম রয়েছে)।

এছাড়াও, সব ডিফল্টরূপে রেজেক্স ব্যাকরণগুলির সাথে ডট মেলে লাইন বিরতি। বুস্টের ECMAScript ব্যাকরণ আপনাকে এটিকে regex_constants::no_mod_m( উত্স ) দিয়ে বন্ধ করতে দেয় ।

জন্য (এটি পসিক্স ভিত্তিক), nবিকল্প ( ডেমো ) ব্যবহার করুন :select regexp_substr('abcde' || chr(10) ||' fghij<Foobar>', '(.*)<Foobar>', 1, 1, 'n', 1) as results from dual

পসিক্স-ভিত্তিক ইঞ্জিনগুলি :

একটি নিছক .ইতিমধ্যে লাইন ব্রেকগুলির সাথে মেলে, কোনও সংশোধক ব্যবহার করার দরকার নেই, দেখুন( ডেমো )

দ্য ( ডেমো ),( ডেমো ),(টিআরই, বেস আর ডিফল্ট ইঞ্জিনটি না দিয়ে perl=TRUE, বেস আর এর সাথে perl=TRUEবা স্ট্রিং / স্ট্রিংয়ের নিদর্শনগুলির জন্য, (?s)ইনলাইন পরিবর্তনকারী ব্যবহার করুন ) ( ডেমো ) .একইভাবে আচরণ করে।

তবে বেশিরভাগ পসিক্স ভিত্তিক সরঞ্জামগুলি ইনপুট লাইন লাইন প্রক্রিয়াকরণ করে। সুতরাং, .লাইন বিরতির সাথে মেলে না কারণ তারা সুযোগের মধ্যে নেই। এটি কীভাবে ওভাররাইড করবেন তা এখানে কয়েকটি উদাহরণ রয়েছে:

  • - একাধিক ওয়ার্কআরউন্ডস রয়েছে, সবচেয়ে সুনির্দিষ্ট তবে খুব নিরাপদ নয় 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)স্কার্পিং সক্ষম করে ., প্যাটার্নের জন্য ডটল মোড সক্ষম করে , (?i)কেস সংবেদনশীল মোড সক্ষম করে, \Kএতদূর মিলেছে পাঠ্যটি বাদ দেয়, *?একটি অলস কোয়ান্টিফায়ার, এর (?=<Foobar>)আগে অবস্থানটির সাথে মেলে <Foobar>
  • - pcregrep -Mi "(?si)abc\K.*?(?=<Foobar>)" file( Mএখানে ফাইল স্লাপিং সক্ষম করে)। নোট pcregrepম্যাক ওএস grepব্যবহারকারীদের জন্য একটি ভাল সমাধান ।

ডেমো দেখুন

নন-পসিক্স-ভিত্তিক ইঞ্জিনগুলি :

  • - ব্যবহারের 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)) }
  • - ব্যবহার [^]বা workaround [\d\D]/ [\w\W]/ [\s\S]( ডেমো ):s.match(/([\s\S]*)<FooBar>/)[1]
  • ( std::regex) ব্যবহার [\s\S]বা জেএস workaround ( ডেমো ):regex rex(R"(([\s\S]*)<FooBar>)");
  • - জাভাস্ক্রিপ্ট হিসাবে একই পন্থা ব্যবহার করুন ([\s\S]*)<Foobar>,। ( দ্রষ্টব্য : অবজেক্টের MultiLineসম্পত্তি RegExpকখনও কখনও ভুলভাবে .লাইন বিরতি জুড়ে ম্যাচটিকে মঞ্জুর করার বিকল্প বলে মনে করা হয় , বাস্তবে, এটি কেবল জেএস রেজেক্সের মতো স্ট্রিংয়ের পরিবর্তে লাইনগুলির শুরু / শেষের সাথে ম্যাচ করার জন্য আচরণ ^এবং $আচরণকে পরিবর্তন করে changes ) আচরণ।)

  • - /m মাল্টলাইন সংশোধক ( ডেমো ) ব্যবহার করুন :s[/(.*)<Foobar>/m, 1]

  • - বেস আর পিসিআরই রিজেক্সস - ব্যবহার করুন (?s): regmatches(x, regexec("(?s)(.*)<FooBar>",x, perl=TRUE))[[1]][2]( ডেমো )
  • - ইন stringr/ stringiরেজেক্স ফান্টস যা আইসিইউ রেজেক্স ইঞ্জিন দ্বারা চালিত হয়, সেগুলিও ব্যবহার করুন (?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>"(গুগল স্প্রেডশিটগুলিতে, =REGEXEXTRACT(A2,"(?s)(.*)<Foobar>"))

নোটগুলি চালু(?s) :

বেশিরভাগ নন-পসিক্স ইঞ্জিনগুলিতে, লাইন ব্রেকগুলি ম্যাচ (?s)করার জন্য ইনলাইন পরিবর্তনকারী (বা এম্বেড করা পতাকা বিকল্প) ব্যবহার করা যেতে পারে .

যদি প্যাটার্নের শুরুতে স্থাপন করা হয়, (?s) সমস্তের বাহাওয়ার পরিবর্তন করে .। যদি (?s)শুরুর পরে যদি কোথাও স্থাপন করা হয় তবে কেবলমাত্র এটিরাই .প্রভাবিত হবে যা এটির ডানদিকে অবস্থিত যদি না এটি পাইথনকে না দেওয়া হয় re। পাইথনে re, (?s)অবস্থান নির্বিশেষে পুরো প্যাটার্নটি .প্রভাবিত হয়। (?s)প্রভাব ব্যবহার বন্ধ করা হয় (?-s)। পরিবর্তিত গোষ্ঠীটি কেবলমাত্র একটি রেগেক্স প্যাটার্নের নির্দিষ্ট রেঞ্জকে প্রভাবিত করতে ব্যবহার করা যেতে পারে (যেমন Delim1(?s:.*?)\nDelim2.*প্রথম .*?ম্যাচটি নিউলাইনগুলি জুড়ে তৈরি .*করবে এবং দ্বিতীয়টি কেবলমাত্র রেখার বাকী অংশের সাথে মিলবে)।

পজিক্স নোট :

নন-পসআইএক্স রেজেক্স ইঞ্জিনগুলিতে, কোনও চরের সাথে মেলে, [\s\S]/ [\d\D]/ [\w\W]কনস্ট্রাক্ট ব্যবহার করা যেতে পারে।

পসিক্সে, [\s\S]কোনও চরিত্রের সাথে মেলে না (জাভাস্ক্রিপ্ট বা কোনও নন-পসিক্স ইঞ্জিনের মতো) কারণ রেজিেক্স এস্কেপ সিকোয়েন্সগুলি বন্ধনী এক্সপ্রেশনগুলির ভিতরে সমর্থিত নয়। [\s\S]বন্ধনী এক্সপ্রেশন একটি একক গৃহস্থালির কাজ, মেলে যেমন পার্স করা হয় \বা sবা S


5
আপনার প্রোফাইল পৃষ্ঠা বা কিছু (+1) থেকে এই দুর্দান্ত ওভারভিউয়ের সাথে আপনার লিঙ্ক করা উচিত।
জানুয়ারি

1
আপনি এটি বুস্ট আইটেমটিতে যুক্ত করতে চাইতে পারেন : রিজেক্স_ কনস্ট্যান্টস নেমস্পেসে, ফ্ল্যাগ_ টাইপ_স: পার্ল = ইসমাএসক্রিপ্ট = জাভাস্ক্রিপ্ট = জেএসক্রিপ্ট = :: বুস্ট :: রেজবেস :: সাধারণ = 0 যা পার্লের ডিফল্ট। প্রোগ্রামাররা তার #define MOD regex_constants::perl | boost::regex::no_mod_s | boost::regex::no_mod_mপ্রতিফলিত করার জন্য ত্রিশটি রেজেক্স পতাকাগুলির জন্য একটি বেস পতাকা সংজ্ঞা সেট করবে । আরবিটারটি সর্বদা ইনলাইন পরিবর্তনকারী। যেখানে (?-sm)(?s).*রিসেট।

1
আপনি কি বাশ দয়া করে যোগ করতে পারেন?
পাসুপতি রাজনীকীকাম

2
@ পাসুপথিরজাজনিকম বাশ একটি পসিক্স রেজেক্স ইঞ্জিন ব্যবহার করেছেন, .সেখানে যে কোনও চরটি মিলবে (লাইন ব্রেক সহ)। দেখুন এই অনলাইন ব্যাশ ডেমো
উইক্টর স্ট্রিবিউউ

1
আপনি রক করেন - এটি জটিল তুলনামূলক তুলনায় সবচেয়ে তুলনামূলকভাবে মিনি-টিউটোরিয়াল যা আমি দেখেছি। আপনি প্রাপ্য যে আপনার উত্তর গৃহীত হয়েছে! Goউত্তরে কুদোস ও অতিরিক্ত ভোট !
গ্যুইনেথ ল্লেওলিন

68

আপনি যদি Eclipse অনুসন্ধান ব্যবহার করছেন, আপনি 'ডটল' করতে সক্ষম করতে পারেন ''। লাইন ডিলিমিটারগুলি সহ যে কোনও অক্ষরের সাথে মেলে: আপনার অনুসন্ধানের স্ট্রিংয়ের শুরুতে "(? গুলি)" যুক্ত করুন। উদাহরণ:

(?s).*<FooBar>

1
কোথাও নয়, কেবল রেইগেক্স স্বাদগুলিতে ইনলাইন (?s)(?m)
সংশোধককে

বাশের জন্য কিছু?
পাসুপতি রাজনীকীকাম

38

অনেক রিজেক্স উপভাষায় /[\S\s]*<Foobar>/আপনি যা চান ঠিক তেমনটি করবে। সূত্র


2
এই লিঙ্কটি থেকে: "জাভাস্ক্রিপ্ট এবং ভিবিএস স্ক্রিপ্টের সাথে ডট ম্যাচ লাইন ব্রেক চরিত্রগুলি তৈরি করার বিকল্প নেই those এই ভাষাগুলিতে আপনি কোনও অক্ষরের সাথে মেলে [\ s \ S] এর মতো একটি অক্ষর শ্রেণি ব্যবহার করতে পারেন" " পরিবর্তে . পরিবর্তে [\ s \ S] (ম্যাচ স্পেস এবং ফাঁকা স্থানগুলি) ব্যবহার করুন।
অ্যালেন

32

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

নিউলাইনগুলি (\ r \ n) ব্যতীত সমস্ত বিন্দুর সাথে মেলে। সুতরাং \ s \ S ব্যবহার করুন, যা সমস্ত অক্ষরের সাথে মেলে।


আপনি যদি উদ্দেশ্য-সি ব্যবহার করছেন তবে এটি সমস্যার সমাধান করবে [text rangeOfString:regEx options:NSRegularExpressionSearch]। ধন্যবাদ!
জে কোস্টার

1
ধন্যবাদ ইন্টেলিজের সন্ধান এবং প্রতিস্থাপনের ক্ষেত্রে এটি কাজ করে।
বার্কলে

এইটা কাজ করে. তবে এটির প্রথম উপস্থিতি হওয়া দরকার<FooBar>
ওজকান


13

আমরা ব্যবহার করতে পারেন

(.*?\n)*?

লোভ ছাড়াই নিউলাইন সহ সমস্ত কিছু মেলে

এটি নতুন লাইনটিকে alচ্ছিক করে তুলবে

(.*?|\n)*?

8

"."সাধারণত লাইন ব্রেকগুলির সাথে মেলে না। বেশিরভাগ Sরিজেক্স ইঞ্জিনগুলি আপনাকে নতুন লাইনের সাথে ম্যাচ করার জন্য -ফ্লেগ (এছাড়াও ডাকা হয় DOTALLএবং SINGLELINE) যুক্ত করতে "."দেয়। যদি এটি ব্যর্থ হয় তবে আপনি এমন কিছু করতে পারেন [\S\s]


8

গ্রহণের জন্য নিম্নলিখিত অভিব্যক্তিটি কাজ করেছিল:

foo বিন্যাস

জাদাজাদা বার "

নিয়মিত প্রকাশ:

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

5
/(.*)<FooBar>/s

গুলি কার্টের রিটার্নের সাথে ডট (।) তৈরি করে


এটি দেখে মনে হচ্ছে এটি অবৈধ (ক্রোম): টেক্সট.ম্যাচ (/ a / গুলি) সিনট্যাক্স এরির: রেজিপ্লেক্স নির্মাণকারীর অবৈধ পতাকা সরবরাহ করা হয়েছে
অ্যালেন

কারণ এটি জাভাস্ক্রিপ্ট RegEx ইঞ্জিনগুলিতে অসমর্থিত। sপতাকা, সবচেয়ে সম্পূর্ণ ইঞ্জিন (Perl এবং পিএইচপি উপলব্ধ) PCRE বিদ্যমান। পিসিআরইতে 10 টি পতাকা রয়েছে (এবং আরও অনেকগুলি বৈশিষ্ট্য রয়েছে) যখন জাভাস্ক্রিপ্টে রয়েছে মাত্র 3 টি পতাকা ( gmi)।
মরগান তোভেরি কুইলিং

4

জাভা ভিত্তিক নিয়মিত প্রকাশে আপনি ব্যবহার করতে পারেন [\s\S]


1
এগুলি কি ব্যাকস্ল্যাশ হওয়া উচিত নয়?
পল ড্রাগন

তারা নিয়মিত অভিব্যক্তিটির শেষে যায়, এর মধ্যে নয় Example উদাহরণ: / ব্লা / এস
র্যান্ডমইনসানো

আমার ধারণা আপনি জাভাস্ক্রিপ্ট বলতে চাইছেন, জাভা নয়? যেহেতু আপনি কেবল sজাভাতে প্যাটার্নে পতাকাটি যুক্ত করতে পারেন এবং জাভাস্ক্রিপ্টের sপতাকা নেই
3limin4t0r

3

নোটটি (.|\n)*(উদাহরণস্বরূপ) এর চেয়ে কম দক্ষ হতে পারে [\s\S]*(যদি আপনার ভাষার রেজিক্সগুলি যেমন পালানো সমর্থন করে) এবং কীভাবে পরিবর্তনকারীকে নির্দিষ্ট করতে হয় তার চেয়ে আরও বেশি কার্যকর। এছাড়াও নতুন লাইন মেলে। অথবা আপনি পসিআইসি বিকল্পের সাথে যেতে পারেন [[:space:][:^space:]]*


3

RegexOptions.Singleline ব্যবহার করুন, এর অর্থ পরিবর্তন করে। নতুন লাইন অন্তর্ভুক্ত

Regex.Replace (বিষয়বস্তু, অনুসন্ধান পাঠ্য, প্রতিস্থাপন পাঠ্য, RegexOptions.Singleline);



1

ভাষার মধ্যে ব্যবহারের প্রসঙ্গে নিয়মিত প্রকাশগুলি রেখায় নয় স্ট্রিংগুলিতে কাজ করে। সুতরাং ইনপুট স্ট্রিংয়ের একাধিক লাইন রয়েছে বলে ধরে নিয়ে আপনি সাধারণত রেজেক্সটি ব্যবহার করতে সক্ষম হবেন।

এই ক্ষেত্রে, প্রদত্ত রেজেক্স পুরো স্ট্রিংয়ের সাথে মিলবে কারণ "<FooBar>" উপস্থিত রয়েছে। রেজেক্স প্রয়োগের নির্দিষ্টকরণের উপর নির্ভর করে, $ 1 মান ("(। *)" থেকে প্রাপ্ত) হয় "fghij" বা "abcde c nfghij" হবে। অন্যরা যেমন বলেছে, কিছু বাস্তবায়ন আপনাকে "কিনা" তা নিয়ন্ত্রণ করতে দেয়। নতুন লাইনের সাথে মিলবে, আপনাকে পছন্দ দিচ্ছে।

লাইন-ভিত্তিক নিয়মিত প্রকাশের ব্যবহার সাধারণত কমান্ড লাইন জিনিসগুলির জন্য যেমন egrep।


1

আমার একই সমস্যা ছিল এবং এটি সম্ভবত সবচেয়ে ভাল উপায়ে সমাধান করা হয়নি তবে এটি কার্যকর হয়। আমার আসল ম্যাচটি করার আগে আমি সমস্ত লাইন ব্রেকগুলি প্রতিস্থাপন করেছি:

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

আমি এইচটিএমএলকে হেরফের করছি তাই লাইন ব্রেকগুলি এ ক্ষেত্রে আমার পক্ষে সত্যিই আসে না।

আমি উপরের সমস্ত পরামর্শগুলি ভাগ্য ছাড়াই চেষ্টা করেছি, আমি ব্যবহার করছি। নেট 3.5 এফওয়াইআই


আমি। নেট ব্যবহার করছি এবং (\s|\S)আমার জন্য কৌশলটি মনে হচ্ছে!
বামশি কৃষ্ণ

@ বামশিকৃষ্ণ। নেট, ম্যাচটি যে কোনও অক্ষর (?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
না, এটা করবেন না। লাইন বিভাজক সহ আপনার যদি কোনও কিছুর মিল দরকার হয় তবে ডটল (ওরফে / এস বা সিঙ্গললাইন) সংশোধক ব্যবহার করুন। (। | \ N) হ্যাক কেবলমাত্র রেজেক্সকে কম দক্ষ করে তোলে না, এটি এমনকি সঠিক নয়। খুব কমপক্ষে, এটির সাথে car r (ক্যারেজ রিটার্ন) এবং \ n (লাইনফিড) মিলানো উচিত। অন্যান্য লাইন বিভাজক অক্ষরও রয়েছে, তবে খুব কমই ব্যবহৃত হয়। তবে আপনি যদি ডটল পতাকা ব্যবহার করেন তবে আপনাকে সেগুলি নিয়ে চিন্তা করার দরকার নেই।
অ্যালান মুর

1
আর একটি হল গ্রাহকের নতুন লাইনের প্ল্যাটফর্ম-স্বতন্ত্র মিল।

এই ছোট্ট রত্নটি অবিশ্বাস্যরূপে কার্যকর হওয়ায় আপনার @ উত্তর: আপনার উত্তর হিসাবে এটি পোস্ট করা উচিত।
জেকহার্ট 21

পরিবর্তে আপনি এটি চেষ্টা করতে পারেন। এটা তোলে ভেতরের বন্ধনী সাথে মেলে না হবে এবং ঐচ্ছিক বিবেচনা \r((?:.|\r?\n)*)<foobar>
SSC-hrep3

0

আমি জাভা ব্লক যদি একটি বিশেষ মিল করতে চেয়েছিলেন

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

   }
...
...
}

আমি যদি রেজিপ্যাক্স ব্যবহার করি

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

এটিতে আমি ব্যবহার করেছি পদ্ধতি ব্লকের জন্য বন্ধনী বন্ধনী অন্তর্ভুক্ত

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

ওয়াইল্ডকার্ড ম্যাচ থেকে বন্ধ বন্ধনী বন্ধ করতে।


0

প্রায়শই আমাদের স্ট্রিংয়ের পূর্ববর্তী লাইনে ছড়িয়ে থাকা কয়েকটি কীওয়ার্ড সহ একটি স্ট্রিং পরিবর্তন করতে হয়। একটি এক্সএমএল উপাদান বিবেচনা করুন:

<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

ডেমো ঘ

বিকল্প 2

দ্বিতীয় mউপায়টি হ'ল (মাল্টলাইন) পতাকা এবং নীচের যে কোনও নিদর্শন ব্যবহার করুন:

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

অথবা

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

অথবা

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

ডেমো 2

রেজেক্স সার্কিট

jex.im নিয়মিত এক্সপ্রেশন ভিজ্যুয়ালাইজ করে:

এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.