অব্যাহতিপ্রাপ্ত উদ্ধৃতি সহ উদ্ধৃত স্ট্রিংয়ের জন্য রেজেেক্স


120

আমি কীভাবে " It's big \"problem "নিয়মিত এক্সপ্রেশন ব্যবহার করে সাবস্ট্রিং পেতে পারি ?

s = ' function(){  return " It\'s big \"problem  ";  }';     

1
আপনি "এটি" একটি স্ট্রিংয়ে কীভাবে খুঁজে পান যেখানে কেবল "হয়" থাকে? আমি এটি আপনার জন্য ঠিক করে দিয়েছি, তবে আপনি যে ভাষাটি ব্যবহার করছেন তাতে কোন একক-উদ্ধৃতি / পালানোর কনভেনশন প্রয়োগ হয় তা আমি জানি না।
জোনাথন লেফলার


2
প্রকৃতপক্ষে, তারিখগুলি দেখে, আমি দেখতে পাচ্ছি যে অন্য প্রশ্নটি এটির একটি সদৃশ। যেভাবেই হোক না কেন, আমার উত্তরটি পরীক্ষা করে দেখুন ।
রডগারুনার

@ অডিগারুন্নার: আপনার পরামর্শ অনুসারে আমি এটি বন্ধ করতে ভোট দিচ্ছি। এটি সত্য অন্য প্রশ্নটি আরও সাম্প্রতিক, তবে এটি আরও ভাল (বেশিরভাগ ক্ষেত্রে আপনার উত্তরটির জন্য ধন্যবাদ)।
অ্যালান মুর

উত্তর:


158
/"(?:[^"\\]|\\.)*"/

দ্য রেজেক্স কোচ এবং পিসিআরই ওয়ার্কবেঞ্চে কাজ করে।

জাভাস্ক্রিপ্ট পরীক্ষার উদাহরণ:

    var s = ' function(){ return " Is big \\"problem\\", \\no? "; }';
    var m = s.match(/"(?:[^"\\]|\\.)*"/);
    if (m != null)
        alert(m);


23
বোধ হয়। সরল ইংরাজী: শূন্য বা তার বেশি চারপাশে দুটি উক্তি "যে কোনও বর্ণ যা উদ্ধৃতি বা ব্যাকস্ল্যাশ নয়" বা "কোনও অক্ষর অনুসরণকারী একটি ব্যাকস্ল্যাশ" surrounding আমি বিশ্বাস করতে পারি না যে আমি এটি করার কথা ভাবিনি ...
আজেদী 32

7
আমি নিজেই জবাব দেব। =) (?:...)একটি প্যাসিভ বা নন-ক্যাপচারিং গ্রুপ। এর অর্থ এটি পরে পুনঃপ্রকাশ করা যাবে না।
ম্যাগরাস

অনেকগুলি অনুসন্ধানের পরে এবং অনেকগুলি পরীক্ষা করার পরে এটিই এই সাধারণ সমস্যাটির কাছে আসল এবং একমাত্র সমাধান found ধন্যবাদ!
ক্যান্সারবেরো

9
এর জন্য ধন্যবাদ. আমি একক উদ্ধৃতিগুলির সাথেও মিল রাখতে চেয়েছিলাম তাই এটির সাথে এটি খাপ খাইয়ে শেষ করেছি:/(["'])(?:[^\1\\]|\\.)*?\1/
লিও

এর সাথে var s = ' my \\"new\\" string and \"this should be matched\"';, এই পদ্ধতির ফলে অপ্রত্যাশিত ফলাফলের দিকে পরিচালিত হবে।
উইক্টর স্ট্রিবিউ

32

এটি একটি ন্যানোর্ক থেকে আসে many বিভিন্ন লিনাক্স ডিস্ট্রোজে উপলব্ধ নমুনা। এটি সি স্টাইলের স্ট্রিংয়ের সিনট্যাক্স হাইলাইট করার জন্য ব্যবহৃত হয়

\"(\\.|[^\"])*\"

এর সাথে var s = ' my \\"new\\" string and \"this should be matched\"';, এই পদ্ধতির ফলে অপ্রত্যাশিত ফলাফলের দিকে পরিচালিত হবে।
উইক্টর স্ট্রিবিউ

1
c.nanorc আমার প্রথম স্থান ছিল। এটির মতো ডাবল-পলায়ন না হওয়া পর্যন্ত এটি একটি সি স্ট্রিং আক্ষরিক অংশ হিসাবে কাজ করতে " \"(\\\\.|[^\\\"])*\" "
পারেনি

এটি libc থেকে egrep এবং re_comp / re_exec ফাংশনগুলির সাথে কাজ করে।
fk0

19

যেমন ইফেরাওয়ানের দ্বারা সরবরাহ করা হয়েছে, উত্তরটি

/"([^"\\]*(\\.[^"\\]*)*)"/

উপরেরগুলি একক উদ্ধৃত বা ডাবল উদ্ধৃত স্ট্রিংগুলিতে প্রয়োগ করতে, ব্যবহার করুন

/"([^"\\]*(\\.[^"\\]*)*)"|\'([^\'\\]*(\\.[^\'\\]*)*)\'/

2
এটিই একমাত্র সেট যা আমার পক্ষে একক, বৃহত 1.5 কেবি উদ্ধৃত স্ট্রিংয়ের সাথে 99 পলায়ন সহ কাজ করেছিল। এই পৃষ্ঠার প্রতিটি অন্যান্য অভিব্যক্তি আমার পাঠ্য সম্পাদককে ওভারফ্লো ত্রুটির সাথে ভেঙে দিয়েছে। যদিও এখানে বেশিরভাগ ব্রাউজারে কাজ করে তবে কিছু মনে রাখবেন। ফিডল: jsfiddle.net/aow20y0L
বিওজর

3
ব্যাখ্যার জন্য নীচে @ মার্কাঅ্যান্ড্রেপলিনের উত্তর দেখুন।
শানচ

10

এখানে প্রদত্ত বেশিরভাগ সমাধান বিকল্প পুনরাবৃত্তি পাথগুলি ব্যবহার করে (অর্থাত্ (এ | বি))।

বড় আকারের ইনপুটগুলিতে আপনি স্ট্যাক ওভারফ্রোসের মুখোমুখি হতে পারেন যেহেতু কিছু প্যাটার্ন সংকলক পুনরাবৃত্তি ব্যবহার করে এটি প্রয়োগ করে।

উদাহরণস্বরূপ জাভা: http://bugs.java.com/bugdatedia/view_bug.do?bug_id=6337993

এটার মতো কিছু: "(?:[^"\\]*(?:\\.)?)*" বা গাই বেডফোর্ড সরবরাহ করেছেন এমন বেশিরভাগ স্ট্যাক ওভারফ্লোগুলি এড়িয়ে পার্সিং পদক্ষেপের পরিমাণ হ্রাস করবে।


9
"(?:\\"|.)*?"

পর্যায়ক্রমে \"এবং .পলান কোট উপর পাস যখন অলস কোয়ান্টিফায়ার *?নিশ্চিত আপনি উদ্ধৃত স্ট্রিংয়ের শেষ প্রান্ত গত যেতে না পারে। নেট ফ্রেমওয়ার্ক আরই ক্লাস নিয়ে কাজ করে


তবে এতে ব্যর্থ হয়"\\"
ইয়ান


/"(?:(?:\\"|[^"])*)"/gএই ঠিক করা উচিত
ডেভ

7
/"(?:[^"\\]++|\\.)*+"/

man perlreপার্ল 5.22.0 ইনস্টল করে একটি লিনাক্স সিস্টেম থেকে সরাসরি নেওয়া । একটি অপ্টিমাইজেশন হিসাবে, এই রেজেক্স উভয়ের 'পোসেসিভ' ফর্ম ব্যবহার করে +এবং *ব্যাকট্র্যাকিং রোধ করতে, কারণ এটি আগেই জানা গিয়েছে যে একটি সমাপ্ত উদ্ধৃতি ছাড়া কোনও স্ট্রিং কোনও ক্ষেত্রেই মেলে না।


4
/(["\']).*?(?<!\\)(\\\\)*\1/is

যে কোনও উদ্ধৃত স্ট্রিংয়ের সাথে কাজ করা উচিত


1
অনুরোধের জন্য দুর্দান্ত, তবে খুব নমনীয় (একক উদ্ধৃতি মেলে ...)। এবং / ".*?????!!)"/ এ সরলীকরণ করা যেতে পারে যদি না আমি কিছু মিস করি। ওহ, এবং কিছু ভাষা (যেমন। জাভাস্ক্রিপ্ট) হায়রে নেতিবাচক বর্ণনার পিছনে ভাবগুলি বোঝে না।
ফিলিহো

1
@ ফিলোহো, কেবলমাত্র একটি একক (? <! \\) ব্যবহার করে স্ট্রিংয়ের শেষে পালানো ব্যাকস্ল্যাশগুলিতে ব্যর্থ হবে। যদিও জাভাস্ক্রিপ্টে লুক-পিছনের বিষয়ে সত্য।
মার্কাস জারদারোট

4

এটি পিসিআরইতে নিখুঁতভাবে কাজ করে এবং স্ট্যাকওভারফ্লোতে পড়ে না।

"(.*?[^\\])??((\\\\)+)?+"

ব্যাখ্যা:

  1. প্রতিটি উদ্ধৃত স্ট্রিং চর দিয়ে শুরু হয়: " ;
  2. .*?এটিতে কোনও অক্ষরের যে কোনও সংখ্যা থাকতে পারে: {অলস মিল}; অব্যাহতি অক্ষর দিয়ে শেষ[^\\] ;
  3. বিবৃতি (2) অলস (!) Alচ্ছিক কারণ স্ট্রিং খালি ("") হতে পারে। তাই:(.*?[^\\])??
  4. অবশেষে, প্রতিটি উদ্ধৃত স্ট্রিং চর ( ") দিয়ে শেষ হয় , তবে এটির আগেও অনেকগুলি পালানোর চিহ্ন চিহ্ন যুক্ত করা যেতে পারে (\\\\)+; এবং এটি লোভী (!) ((\\\\)+)?+alচ্ছিক: reed লোভী মিল}, ব্যাকস স্ট্রিং খালি বা শেষ যুগল ছাড়াই হতে পারে!

এটি বিশ্বের সবচেয়ে দক্ষ প্যাটার্ন নয়, তবে ধারণাটি আকর্ষণীয়। নোট করুন যে আপনি এটি এর মতো সংক্ষিপ্ত করতে পারেন:"(.*?[^\\])?(\\\\)*"
ক্যাসিমির এবং হিপ্পলিট

2

এখানে এমন একটি যা "এবং 'উভয়ের সাথেই কাজ করে এবং আপনি সহজেই অন্যদের শুরুতে জুড়েন।

( "| ') (: \\\ 1 | [^ \ 1])? * \ 1

এটি ব্যাকরফারেন্স (in 1) ম্যাচ হ্যাক্টলি ব্যবহার করে যা প্রথম গ্রুপে রয়েছে ("বা ')।

http://www.regular-expressions.info/backref.html


এটি একটি খুব ভাল সমাধান, তবে [^\1]এটি প্রতিস্থাপন করা উচিত .কারণ এন্টি-ব্যাক-রেফারেন্সের মতো কোনও জিনিস নেই এবং এটি কোনওভাবেই আসে না। কিছু খারাপ হওয়ার আগে প্রথম শর্তটি সর্বদা মিলবে।
সেফ রিড

@SephReed - প্রতিস্থাপন [^\1]সঙ্গে .কার্যকরভাবে এই Regex পরিবর্তন হবে ("|').*?\1এবং তারপর এটি মেলে হবে "foo\"মধ্যে "foo \" bar"। এটি বলেছে যে, [^\1]আসলে কাজ করা কঠিন। @ Mathiashansen - তুমি জবরজং এবং ব্যয়বহুল সাথে উন্নত বন্ধ করছি (?!\1).(তাই পুরো Regex, কিছু দক্ষতা পরিষ্করণ সঙ্গে, হবে (["'])(?:\\.|(?!\1).)*+\1+যদি আপনার ইঞ্জিন এটিকে সমর্থন করে না ঐচ্ছিক।
আদম কাট্স

2

এমন একটি বিকল্প যা আগে স্পর্শ করা হয়নি is

  1. স্ট্রিং বিপরীত।
  2. বিপরীত স্ট্রিংয়ের সাথে মিলটি সম্পাদন করুন।
  3. ম্যাচ করা স্ট্রিংগুলিকে রিভার্স করুন।

এতে পালানো ওপেন ট্যাগগুলি সঠিকভাবে মেলাতে সক্ষম হওয়ার যুক্ত বোনাস রয়েছে।

আপনাকে নীচের স্ট্রিংটি বলতে দেয়; 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


0

একটি মনে রাখতে হবে যে রেজেক্সপস স্ট্রিং-ওয়াইয়ের সমস্ত কিছুর জন্য রূপালী বুলেট নয়। কিছু জিনিস কার্সার এবং লিনিয়ার, ম্যানুয়াল, সন্ধানের সাথে করা সহজ। একটি সিএফএল কৌশলটি বেশ তুচ্ছভাবে করে ফেলবে, তবে অনেকগুলি সিএফএল বাস্তবায়ন নেই (আফাইক)।


3
সত্যই যথেষ্ট, তবে এই সমস্যাটি রেজিক্সের ক্ষমতার মধ্যে রয়েছে এবং সেগুলির অনেকগুলি বাস্তবায়ন রয়েছে।
অ্যালান মুর

0

Https://stackoverflow.com/a/10786066/1794894 এর আরও বিস্তৃত সংস্করণ

/"([^"\\]{50,}(\\.[^"\\]*)*)"|\'[^\'\\]{50,}(\\.[^\'\\]*)*\'|“[^”\\]{50,}(\\.[^“\\]*)*”/   

এই সংস্করণেও রয়েছে

  1. সর্বনিম্ন উদ্ধৃতি দৈর্ঘ্য 50
  2. অতিরিক্ত ধরণের উদ্ধৃতি (উন্মুক্ত এবং বন্ধ )


0

যদি প্রথম থেকেই এটি অনুসন্ধান করা হয় তবে এটি কি কাজ করতে পারে?

\"((\\\")|[^\\])*\"

0

উদ্ধৃত স্ট্রিংগুলি মুছে ফেলার চেষ্টা করে আমি একই ধরণের সমস্যার মুখোমুখি হয়েছি যা কিছু ফাইল বিশ্লেষণে বাধা দিতে পারে।

আমি একটি দ্বি-পদক্ষেপের সমাধান দিয়ে শেষ করেছি যা আপনি যে কোনও কনভোলজড রেইজেক্সকে মারতে পারেন:

 line = line.replace("\\\"","\'"); // Replace escaped quotes with something easier to handle
 line = line.replaceAll("\"([^\"]*)\"","\"x\""); // Simple is beautiful

পড়া সহজ এবং সম্ভবত আরও দক্ষ।


0

যদি আপনার আইডিই ইন্টেলিজ আইডিয়া হয় তবে আপনি এই সমস্ত মাথাব্যথাটি ভুলে গিয়ে আপনার রেজেক্সকে স্ট্রিং ভেরিয়েবলের মধ্যে সংরক্ষণ করতে পারেন এবং ডাবল-কোটের ভিতরে এটি অনুলিপি করে দিলে এটি স্বয়ংক্রিয়ভাবে একটি রেজেক্স গ্রহণযোগ্য বিন্যাসে পরিবর্তিত হবে।

জাভাতে উদাহরণ:

String s = "\"en_usa\":[^\\,\\}]+";

এখন আপনি এই পরিবর্তনশীলটিকে আপনার রিজেক্সেপ বা অন্য কোথাও ব্যবহার করতে পারেন।

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