পার্থক্য কি .*? এবং। * নিয়মিত প্রকাশ?


142

আমি রেজেক্স ব্যবহার করে একটি স্ট্রিংকে দুটি ভাগে ভাগ করার চেষ্টা করছি। স্ট্রিংটি নিম্নরূপ ফর্ম্যাট করা হয়েছে:

text to extract<number>

আমি ব্যবহার করছি (.*?)<এবং <(.*?)>কোনটি ভাল কাজ করে তবে রেগেক্সে কিছুটা পড়ার পরে আমি ভাবতে শুরু করেছি যে কেন আমাকে ?এক্সপ্রেশনগুলির মধ্যে এটি প্রয়োজন । আমি এই সাইটের মাধ্যমে এটি সন্ধানের পরে কেবল এটির মতো করেছিলাম তাই পার্থক্য কী তা আমি ঠিক নিশ্চিত নই।


1
আরও দেখুন stackoverflow.com/questions/2301285/...
Cemafor

উত্তর:


172

এটি লোভী এবং অ-লোভী কোয়ান্টিফায়ারগুলির মধ্যে পার্থক্য।

ইনপুট বিবেচনা করুন 101000000000100

ব্যবহার করা 1.*1, *লোভজনক - এটি শেষ পর্যন্ত সমস্তভাবে মিলবে এবং তারপরে এটি মেলে না পারা পর্যন্ত ব্যাকট্র্যাক করবে 1, আপনাকে ছেড়ে চলে যাবে 1010000000001
.*?লোভী হয়। *কোনও কিছুর সাথে মিলবে না, তবে 1শেষ পর্যন্ত মিল না হওয়া পর্যন্ত অতিরিক্ত অক্ষরগুলি মেলে দেখার চেষ্টা করবে 101

সকল quantifiers একটি অ-লোভী মোড আছে: .*?, .+?, .{2,6}?, এবং এমনকি .??

আপনার ক্ষেত্রে, অনুরূপ প্যাটার্নটি হতে পারে <([^>]*)>- বৃহত্তর চিহ্ন ছাড়া অন্য কোনও কিছুর সাথে মিলে যাওয়া (কড়া কথায় বলতে গেলে এটি শূন্যের সাথে মেলে এবং এর >মধ্যে <এবং আরও কিছু অক্ষরের সাথে মেলে >)।

দেখুন কোয়ান্টিফায়ার চিট শিট


আহা দুর্দান্ত, আমি> চিহ্ন ছাড়া অন্য যে কোনও একটিতে পছন্দ করি!
ডগ

1
লোভী কীভাবে লোভী ?থেকে পৃথক হয় তার একটি উদাহরণ আপনি ব্যাখ্যা বা প্রদর্শন করতে পারেন ???
অ্যাড্রিয়ান এইচএইচ এইচ

4
অবশ্যই। স্ট্রিংয়ের জন্য "abc", রেজেক্স /\w\w?\w/পুরো স্ট্রিংয়ের সাথে মিলবে "abc"- কারণ ?এটি লোভী। /\w\w??\w/অলস - এটি কেবল মিলবে "ab"। এটি ব্যাকট্র্যাক করবে এবং "abc"এটি যদি পরে ব্যর্থ হয় তবে তা মিলবে ।
কোবি

184

লোভী বনাম অ-লোভী উপর

ডিফল্টরূপে রেজেক্সে পুনরাবৃত্তি লোভী : তারা যতটা সম্ভব সংখ্যক প্রতিরূপের সাথে মেলে চেষ্টা করে এবং যখন এটি কাজ করে না এবং তাদের ব্যাকট্র্যাক করতে হয়, পুরো প্যাটার্নের ম্যাচ না হওয়া পর্যন্ত তারা একবারে একটি করে কম রিপ্রেসের সাথে মেলে চেষ্টা করে until পাওয়া যায় নি। ফলস্বরূপ, যখন একটি ম্যাচ পরিশেষে ঘটে, একটি অর্থগৃধ্নু পুনরাবৃত্তি যেমন মেলে দিবে অনেক সম্ভব প্রতিনিধি।

?একটি পুনরাবৃত্তি কোয়ান্টিফায়ার মধ্যে এই আচরণ পরিবর্তন হিসাবে অ লোভী , নামেও অনিচ্ছুক ( উদাঃ জাভা ) (এবং কখনও কখনও "অলস")। বিপরীতে, এই পুনরাবৃত্তিটি প্রথমে যথাসম্ভব কয়েকটি সংখ্যক মিলকে মিলিয়ে দেখার চেষ্টা করবে এবং যখন এটি কাজ করে না এবং তাদের ব্যাকট্র্যাক করতে হয়, তখন তারা আরও একটি বারের সাথে মিলে যায়। ফলস্বরূপ, যখন একটি ম্যাচ পরিশেষে ঘটে, একটি অনিচ্ছুক পুনরাবৃত্তি যেমন মেলে দিবে কয়েক সম্ভব প্রতিনিধি।

তথ্যসূত্র


উদাহরণ 1: এ থেকে জেড পর্যন্ত

আসুন এই দুটি নিদর্শন তুলনা করা যাক: A.*Zএবং A.*?Z

নিম্নলিখিত ইনপুট দেওয়া হয়েছে:

eeeAiiZuuuuAoooZeeee

নিদর্শনগুলি নিম্নলিখিত ম্যাচগুলি দেয়:

প্রথমে কি A.*Zকরে তার উপর ফোকাস করা যাক । এটি প্রথমটির সাথে মিলে গেলে A, .*লোভী হওয়ার কারণে, প্রথমে .যথাসম্ভব মেলানোর চেষ্টা করে ।

eeeAiiZuuuuAoooZeeee
   \_______________/
    A.* matched, Z can't match

যেহেতু Zমেলে না, ইঞ্জিনটি ব্যাকট্র্যাক করে এবং .*তারপরে অবশ্যই একটি কম লোকের সাথে মেলে .:

eeeAiiZuuuuAoooZeeee
   \______________/
    A.* matched, Z still can't match

এটি আরও কয়েকবার ঘটে, অবশেষে আমরা এখানে আসার আগে পর্যন্ত:

eeeAiiZuuuuAoooZeeee
   \__________/
    A.* matched, Z can now match

এখন Zমিলতে পারে, সুতরাং সামগ্রিক প্যাটার্ন মেলে:

eeeAiiZuuuuAoooZeeee
   \___________/
    A.*Z matched

বিপরীতে, A.*?Zপ্রথম ম্যাচে .যতটা সম্ভব সংখ্যক অনিচ্ছুক পুনরাবৃত্তি এবং তারপরে .প্রয়োজনীয় হিসাবে আরও গ্রহণ করা । এটি কেন ইনপুটটিতে দুটি মিল খুঁজে পায় তা ব্যাখ্যা করে।

দুটি নিদর্শন কী মিলছে তার এখানে একটি দর্শনীয় উপস্থাপনা:

eeeAiiZuuuuAoooZeeee
   \__/r   \___/r      r = reluctant
    \____g____/        g = greedy

উদাহরণ: একটি বিকল্প

অনেক অ্যাপ্লিকেশনগুলিতে, উপরের ইনপুটটিতে দুটি ম্যাচ যা পছন্দসই তা হ'ল, সুতরাং অতিরিক্ত মেজাজ ঠেকানোর জন্য লোভীর .*?পরিবর্তে অনিচ্ছুক ব্যবহার করা হয় .*। এই নির্দিষ্ট প্যাটার্নের জন্য, তবে অবহেলিত চরিত্র শ্রেণীর ব্যবহার করে আরও ভাল বিকল্প রয়েছে।

প্যাটার্নটি উপরের ইনপুটটির জন্য প্যাটার্নের A[^Z]*Zমতো একই দুটি ম্যাচও আবিষ্কার করে A.*?Z(আদর্শ আইটেম হিসাবে দেখা যায় )। [^Z]একে অবহেলিত চরিত্রের শ্রেণি বলা হয় : এটির সাথে কিছু মিলছে Z

দুটি নিদর্শনগুলির মধ্যে প্রধান পার্থক্যটি হল পারফরম্যান্স: আরও কঠোর হওয়ায় অবহেলিত চরিত্রের শ্রেণি প্রদত্ত ইনপুটটির জন্য কেবল একটি পথের সাথে মেলে। আপনি এই প্যাটার্নটির জন্য লোভী বা অনিচ্ছুক সংশোধক ব্যবহার করেন কিনা তা বিবেচ্য নয়। প্রকৃতপক্ষে, কিছু স্বাদে, আপনি আরও ভাল করতে পারেন এবং অধিষ্ঠিত কোয়ান্টিফায়ার বলা হয় যা ব্যবহার করতে পারেন, যা মোটেই ব্যাকট্র্যাক হয় না।

তথ্যসূত্র


উদাহরণ 2: এ থেকে জেডজেডে

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

eeAiiZooAuuZZeeeZZfff

উপরের ইনপুটটির জন্য এটি ম্যাচগুলি:

তারা কী মিলছে তার একটি ভিজ্যুয়াল উপস্থাপনা:

         ___n
        /   \              n = negated character class
eeAiiZooAuuZZeeeZZfff      r = reluctant
  \_________/r   /         g = greedy
   \____________/g

সম্পর্কিত বিষয়

এগুলি স্ট্যাকওভারফ্লো সম্পর্কিত প্রশ্ন এবং উত্তরের লিঙ্ক যা কিছু আগ্রহী বিষয় থাকতে পারে cover

একটি লোভী পুনরাবৃত্তি অন্যকে ছাড়িয়ে যেতে পারে


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


4
এই উত্তরটি স্ট্যাক ওভারফ্লো নিয়মিত এক্সপ্রেশন FAQ এ যুক্ত করা হয়েছে , "কোয়ান্টিফায়ার্স> পার্থক্য সম্পর্কে আরও ..." এর আওতায়
aliteralmind 0

এই উত্তরটি সত্যই নির্বাচিত উত্তর হওয়ার দাবিদার! আপনার বিস্তারিত ব্যাখ্যার জন্য আপনাকে অনেক ধন্যবাদ।
masky007

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

20

আসুন বলি আপনার কাছে রয়েছে:

<a></a>

<(.*)>মিলবে a></aযেখানে <(.*?)>মিলবে a। দ্বিতীয়টি প্রথম ম্যাচের পরে থামে >। এটি .*পরবর্তী এক্সপ্রেশন দ্বারা অনুসরণ করা এক বা 0 ম্যাচের জন্য পরীক্ষা করে।

প্রথমটির সাথে <(.*)>মিলে গেলে প্রথম প্রকাশটি থামবে না >। এটি শেষ ম্যাচ অবধি চলবে >


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