আমি কীভাবে " 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\"';
, এই পদ্ধতির ফলে অপ্রত্যাশিত ফলাফলের দিকে পরিচালিত হবে।
এটি একটি ন্যানোর্ক থেকে আসে many বিভিন্ন লিনাক্স ডিস্ট্রোজে উপলব্ধ নমুনা। এটি সি স্টাইলের স্ট্রিংয়ের সিনট্যাক্স হাইলাইট করার জন্য ব্যবহৃত হয়
\"(\\.|[^\"])*\"
var s = ' my \\"new\\" string and \"this should be matched\"';
, এই পদ্ধতির ফলে অপ্রত্যাশিত ফলাফলের দিকে পরিচালিত হবে।
" \"(\\\\.|[^\\\"])*\" "
যেমন ইফেরাওয়ানের দ্বারা সরবরাহ করা হয়েছে, উত্তরটি
/"([^"\\]*(\\.[^"\\]*)*)"/
উপরেরগুলি একক উদ্ধৃত বা ডাবল উদ্ধৃত স্ট্রিংগুলিতে প্রয়োগ করতে, ব্যবহার করুন
/"([^"\\]*(\\.[^"\\]*)*)"|\'([^\'\\]*(\\.[^\'\\]*)*)\'/
এখানে প্রদত্ত বেশিরভাগ সমাধান বিকল্প পুনরাবৃত্তি পাথগুলি ব্যবহার করে (অর্থাত্ (এ | বি))।
বড় আকারের ইনপুটগুলিতে আপনি স্ট্যাক ওভারফ্রোসের মুখোমুখি হতে পারেন যেহেতু কিছু প্যাটার্ন সংকলক পুনরাবৃত্তি ব্যবহার করে এটি প্রয়োগ করে।
উদাহরণস্বরূপ জাভা: http://bugs.java.com/bugdatedia/view_bug.do?bug_id=6337993
এটার মতো কিছু:
"(?:[^"\\]*(?:\\.)?)*"
বা গাই বেডফোর্ড সরবরাহ করেছেন এমন বেশিরভাগ স্ট্যাক ওভারফ্লোগুলি এড়িয়ে পার্সিং পদক্ষেপের পরিমাণ হ্রাস করবে।
/"(?:[^"\\]++|\\.)*+"/
man perlre
পার্ল 5.22.0 ইনস্টল করে একটি লিনাক্স সিস্টেম থেকে সরাসরি নেওয়া । একটি অপ্টিমাইজেশন হিসাবে, এই রেজেক্স উভয়ের 'পোসেসিভ' ফর্ম ব্যবহার করে +
এবং *
ব্যাকট্র্যাকিং রোধ করতে, কারণ এটি আগেই জানা গিয়েছে যে একটি সমাপ্ত উদ্ধৃতি ছাড়া কোনও স্ট্রিং কোনও ক্ষেত্রেই মেলে না।
/(["\']).*?(?<!\\)(\\\\)*\1/is
যে কোনও উদ্ধৃত স্ট্রিংয়ের সাথে কাজ করা উচিত
এটি পিসিআরইতে নিখুঁতভাবে কাজ করে এবং স্ট্যাকওভারফ্লোতে পড়ে না।
"(.*?[^\\])??((\\\\)+)?+"
ব্যাখ্যা:
"
;.*?
এটিতে কোনও অক্ষরের যে কোনও সংখ্যা থাকতে পারে: {অলস মিল}; অব্যাহতি অক্ষর দিয়ে শেষ[^\\]
;(.*?[^\\])??
"
) দিয়ে শেষ হয় , তবে এটির আগেও অনেকগুলি পালানোর চিহ্ন চিহ্ন যুক্ত করা যেতে পারে (\\\\)+
; এবং এটি লোভী (!) ((\\\\)+)?+
alচ্ছিক: reed লোভী মিল}, ব্যাকস স্ট্রিং খালি বা শেষ যুগল ছাড়াই হতে পারে!"(.*?[^\\])?(\\\\)*"
এখানে এমন একটি যা "এবং 'উভয়ের সাথেই কাজ করে এবং আপনি সহজেই অন্যদের শুরুতে জুড়েন।
( "| ') (: \\\ 1 | [^ \ 1])? * \ 1
এটি ব্যাকরফারেন্স (in 1) ম্যাচ হ্যাক্টলি ব্যবহার করে যা প্রথম গ্রুপে রয়েছে ("বা ')।
[^\1]
এটি প্রতিস্থাপন করা উচিত .
কারণ এন্টি-ব্যাক-রেফারেন্সের মতো কোনও জিনিস নেই এবং এটি কোনওভাবেই আসে না। কিছু খারাপ হওয়ার আগে প্রথম শর্তটি সর্বদা মিলবে।
[^\1]
সঙ্গে .
কার্যকরভাবে এই Regex পরিবর্তন হবে ("|').*?\1
এবং তারপর এটি মেলে হবে "foo\"
মধ্যে "foo \" bar"
। এটি বলেছে যে, [^\1]
আসলে কাজ করা কঠিন। @ Mathiashansen - তুমি জবরজং এবং ব্যয়বহুল সাথে উন্নত বন্ধ করছি (?!\1).
(তাই পুরো Regex, কিছু দক্ষতা পরিষ্করণ সঙ্গে, হবে (["'])(?:\\.|(?!\1).)*+\1
। +
যদি আপনার ইঞ্জিন এটিকে সমর্থন করে না ঐচ্ছিক।
এমন একটি বিকল্প যা আগে স্পর্শ করা হয়নি is
এতে পালানো ওপেন ট্যাগগুলি সঠিকভাবে মেলাতে সক্ষম হওয়ার যুক্ত বোনাস রয়েছে।
আপনাকে নীচের স্ট্রিংটি বলতে দেয়; 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 ব্যাখ্যা করতে। এটিই হ'ল রেজিপেক্সটি সহজেই তিনটি টুকরো টুকরো করা যায়। নিম্নরূপ:
# 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
একটি মনে রাখতে হবে যে রেজেক্সপস স্ট্রিং-ওয়াইয়ের সমস্ত কিছুর জন্য রূপালী বুলেট নয়। কিছু জিনিস কার্সার এবং লিনিয়ার, ম্যানুয়াল, সন্ধানের সাথে করা সহজ। একটি সিএফএল কৌশলটি বেশ তুচ্ছভাবে করে ফেলবে, তবে অনেকগুলি সিএফএল বাস্তবায়ন নেই (আফাইক)।
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
পড়া সহজ এবং সম্ভবত আরও দক্ষ।
যদি আপনার আইডিই ইন্টেলিজ আইডিয়া হয় তবে আপনি এই সমস্ত মাথাব্যথাটি ভুলে গিয়ে আপনার রেজেক্সকে স্ট্রিং ভেরিয়েবলের মধ্যে সংরক্ষণ করতে পারেন এবং ডাবল-কোটের ভিতরে এটি অনুলিপি করে দিলে এটি স্বয়ংক্রিয়ভাবে একটি রেজেক্স গ্রহণযোগ্য বিন্যাসে পরিবর্তিত হবে।
জাভাতে উদাহরণ:
String s = "\"en_usa\":[^\\,\\}]+";
এখন আপনি এই পরিবর্তনশীলটিকে আপনার রিজেক্সেপ বা অন্য কোথাও ব্যবহার করতে পারেন।