উদাহরণস্বরূপ, এই regex
(.*)<FooBar>
মিলবে:
abcde<FooBar>
তবে আমি কীভাবে এটি একাধিক লাইন জুড়ে মেলাতে পারি?
abcde
fghij<FooBar>
উদাহরণস্বরূপ, এই regex
(.*)<FooBar>
মিলবে:
abcde<FooBar>
তবে আমি কীভাবে এটি একাধিক লাইন জুড়ে মেলাতে পারি?
abcde
fghij<FooBar>
উত্তর:
এটি ভাষার উপর নির্ভর করে, তবে এমন একটি সংশোধক থাকতে হবে যা আপনি রেজেক্স প্যাটার্নে যুক্ত করতে পারেন। পিএইচপি তে এটি:
/(.*)<FooBar>/s
গুলি শেষে ডট মেলে ঘটায় সব নতুন লাইন সহ অক্ষর।
s
। পরিবর্তে, [^]*
একই প্রভাব জন্য না।
m
সংশোধকটি ব্যবহার করুন
এটা চেষ্টা কর:
((.|\n)*)<FooBar>
এটি মূলত "যে কোনও চরিত্র বা একটি নতুন লাইন" পুনরাবৃত্তি শূন্য বা তার বেশি বার বলে।
((.|\n|\r)*)<FooBar>
[\s\S]*
বা (?s).*
।
প্রশ্ন হলো, যায় .
প্যাটার্ন মেলে কোন চরিত্রের সাথে কী ? উত্তর ইঞ্জিন থেকে ইঞ্জিনে পরিবর্তিত হয়। মূল পার্থক্যটি হ'ল প্যাটার্নটি কোনও পসিক্স বা নন-পসিক্স রেইজেক্স লাইব্রেরি দ্বারা ব্যবহৃত হয়।
সম্পর্কে বিশেষ নোট Lua-নিদর্শন: এগুলিকে নিয়মিত অভিব্যক্তি হিসাবে বিবেচনা করা হয় না, তবে .
সেখানে পসিক্স ভিত্তিক ইঞ্জিনগুলির মতো কোনও চরিত্রের সাথে মেলে।
আরেকটি নোট অন মতলব এবং অষ্টক: .
ডিফল্ট ( ডেমো ) দ্বারা যে কোনও চরকে মেলে : 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
পসিক্স-ভিত্তিক ইঞ্জিনগুলি :
একটি নিছক .
ইতিমধ্যে লাইন ব্রেকগুলির সাথে মেলে, কোনও সংশোধক ব্যবহার করার দরকার নেই, দেখুনসজোরে আঘাত( ডেমো )
দ্য TCL( ডেমো ),PostgreSQL( ডেমো ),R(টিআরই, বেস আর ডিফল্ট ইঞ্জিনটি না দিয়ে 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>)");
VBA VB স্ক্রিপ্ট- জাভাস্ক্রিপ্ট হিসাবে একই পন্থা ব্যবহার করুন ([\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:®exError];
(?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
।
#define MOD regex_constants::perl | boost::regex::no_mod_s | boost::regex::no_mod_m
প্রতিফলিত করার জন্য ত্রিশটি রেজেক্স পতাকাগুলির জন্য একটি বেস পতাকা সংজ্ঞা সেট করবে । আরবিটারটি সর্বদা ইনলাইন পরিবর্তনকারী। যেখানে (?-sm)(?s).*
রিসেট।
.
সেখানে যে কোনও চরটি মিলবে (লাইন ব্রেক সহ)। দেখুন এই অনলাইন ব্যাশ ডেমো ।
Go
উত্তরে কুদোস ও অতিরিক্ত ভোট !
আপনি যদি Eclipse অনুসন্ধান ব্যবহার করছেন, আপনি 'ডটল' করতে সক্ষম করতে পারেন ''। লাইন ডিলিমিটারগুলি সহ যে কোনও অক্ষরের সাথে মেলে: আপনার অনুসন্ধানের স্ট্রিংয়ের শুরুতে "(? গুলি)" যুক্ত করুন। উদাহরণ:
(?s).*<FooBar>
(?s)
(?m)
অনেক রিজেক্স উপভাষায় /[\S\s]*<Foobar>/
আপনি যা চান ঠিক তেমনটি করবে। সূত্র
([\s\S]*)<FooBar>
নিউলাইনগুলি (\ r \ n) ব্যতীত সমস্ত বিন্দুর সাথে মেলে। সুতরাং \ s \ S ব্যবহার করুন, যা সমস্ত অক্ষরের সাথে মেলে।
[text rangeOfString:regEx options:NSRegularExpressionSearch]
। ধন্যবাদ!
<FooBar>
ইন রুবি চুনিআপনি ' m
' বিকল্পটি (মাল্টলাইন) ব্যবহার করতে পারেন :
/YOUR_REGEXP/m
আরও তথ্যের জন্য রুবি -ডোক.আর.জে রেজিপ্লেক্স ডকুমেন্টেশন দেখুন ।
আমরা ব্যবহার করতে পারেন
(.*?\n)*?
লোভ ছাড়াই নিউলাইন সহ সমস্ত কিছু মেলে
এটি নতুন লাইনটিকে alচ্ছিক করে তুলবে
(.*?|\n)*?
"."
সাধারণত লাইন ব্রেকগুলির সাথে মেলে না। বেশিরভাগ S
রিজেক্স ইঞ্জিনগুলি আপনাকে নতুন লাইনের সাথে ম্যাচ করার জন্য -ফ্লেগ (এছাড়াও ডাকা হয় DOTALL
এবং SINGLELINE
) যুক্ত করতে "."
দেয়। যদি এটি ব্যর্থ হয় তবে আপনি এমন কিছু করতে পারেন [\S\s]
।
/(.*)<FooBar>/s
গুলি কার্টের রিটার্নের সাথে ডট (।) তৈরি করে
s
পতাকা, সবচেয়ে সম্পূর্ণ ইঞ্জিন (Perl এবং পিএইচপি উপলব্ধ) PCRE বিদ্যমান। পিসিআরইতে 10 টি পতাকা রয়েছে (এবং আরও অনেকগুলি বৈশিষ্ট্য রয়েছে) যখন জাভাস্ক্রিপ্টে রয়েছে মাত্র 3 টি পতাকা ( gmi
)।
জাভা ভিত্তিক নিয়মিত প্রকাশে আপনি ব্যবহার করতে পারেন [\s\S]
s
জাভাতে প্যাটার্নে পতাকাটি যুক্ত করতে পারেন এবং জাভাস্ক্রিপ্টের s
পতাকা নেই
প্যাটার্ন মডিফায়ার এস ইউ পিএইচপি-তে পছন্দসই মিলবে।
preg_match('/(.*)/sU',$content,$match);
http://dreamluverz.com/developers-tools/regex-match-all-including-new-line http://php.net/manual/en/references.pcre.pattern.modifiers.php
ভাষার মধ্যে ব্যবহারের প্রসঙ্গে নিয়মিত প্রকাশগুলি রেখায় নয় স্ট্রিংগুলিতে কাজ করে। সুতরাং ইনপুট স্ট্রিংয়ের একাধিক লাইন রয়েছে বলে ধরে নিয়ে আপনি সাধারণত রেজেক্সটি ব্যবহার করতে সক্ষম হবেন।
এই ক্ষেত্রে, প্রদত্ত রেজেক্স পুরো স্ট্রিংয়ের সাথে মিলবে কারণ "<FooBar>" উপস্থিত রয়েছে। রেজেক্স প্রয়োগের নির্দিষ্টকরণের উপর নির্ভর করে, $ 1 মান ("(। *)" থেকে প্রাপ্ত) হয় "fghij" বা "abcde c nfghij" হবে। অন্যরা যেমন বলেছে, কিছু বাস্তবায়ন আপনাকে "কিনা" তা নিয়ন্ত্রণ করতে দেয়। নতুন লাইনের সাথে মিলবে, আপনাকে পছন্দ দিচ্ছে।
লাইন-ভিত্তিক নিয়মিত প্রকাশের ব্যবহার সাধারণত কমান্ড লাইন জিনিসগুলির জন্য যেমন egrep।
আমার একই সমস্যা ছিল এবং এটি সম্ভবত সবচেয়ে ভাল উপায়ে সমাধান করা হয়নি তবে এটি কার্যকর হয়। আমার আসল ম্যাচটি করার আগে আমি সমস্ত লাইন ব্রেকগুলি প্রতিস্থাপন করেছি:
mystring= Regex.Replace(mystring, "\r\n", "")
আমি এইচটিএমএলকে হেরফের করছি তাই লাইন ব্রেকগুলি এ ক্ষেত্রে আমার পক্ষে সত্যিই আসে না।
আমি উপরের সমস্ত পরামর্শগুলি ভাগ্য ছাড়াই চেষ্টা করেছি, আমি ব্যবহার করছি। নেট 3.5 এফওয়াইআই
(\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();
}
...
...
}
আমি যদি রেজিপ্যাক্স ব্যবহার করি
if \(isTrue(.|\n)*}
এটিতে আমি ব্যবহার করেছি পদ্ধতি ব্লকের জন্য বন্ধনী বন্ধনী অন্তর্ভুক্ত
if \(!isTrue([^}.]|\n)*}
ওয়াইল্ডকার্ড ম্যাচ থেকে বন্ধ বন্ধনী বন্ধ করতে।
প্রায়শই আমাদের স্ট্রিংয়ের পূর্ববর্তী লাইনে ছড়িয়ে থাকা কয়েকটি কীওয়ার্ড সহ একটি স্ট্রিং পরিবর্তন করতে হয়। একটি এক্সএমএল উপাদান বিবেচনা করুন:
<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 নিয়মিত এক্সপ্রেশন ভিজ্যুয়ালাইজ করে: