নিয়মিত অভিব্যক্তিগুলিতে নেস্টেড ক্যাপচারিং গ্রুপগুলি কীভাবে গণনা করা হয়?


85

নিয়মিত প্রকাশগুলি কীভাবে নেস্টেড প্রথম বন্ধনীগুলির ক্যাপচারিং আচরণ পরিচালনা করতে পারে তার জন্য কোনও সংজ্ঞাযুক্ত আচরণ রয়েছে? আরও সুনির্দিষ্টভাবে, আপনি কি যুক্তিসঙ্গতভাবে আশা করতে পারেন যে বিভিন্ন ইঞ্জিনগুলি প্রথম অবস্থানে এবং পরবর্তী অবস্থানগুলিতে নেস্টেড বন্ধনীগুলি ক্যাপচার করবে?

নিম্নলিখিত পিএইচপি কোড বিবেচনা করুন (পিসিআরই নিয়মিত এক্সপ্রেশন ব্যবহার করে)

<?php
  $test_string = 'I want to test sub patterns';
  preg_match('{(I (want) (to) test) sub (patterns)}', $test_string, $matches);
  print_r($matches);
?>

Array
(
    [0] => I want to test sub patterns  //entire pattern
    [1] => I want to test           //entire outer parenthesis
    [2] => want             //first inner
    [3] => to               //second inner
    [4] => patterns             //next parentheses set
)

পুরো বন্ধনীযুক্ত এক্সপ্রেশনটি প্রথমে ক্যাপচার করা হয়েছে (আমি পরীক্ষা করতে চাই) এবং তারপরে অভ্যন্তরীণ প্রথম বন্ধনীগুলি পরবর্তী ("চান" এবং "থেকে") ক্যাপচার করা হয়। এটি যৌক্তিক ধারণা তৈরি করে, তবে আমি প্রথম প্যারেন্যাসিসগুলি প্রথমে ক্যাপচার করার জন্য এবং একই সাথে পুরো প্যাটার্নটি ক্যাপচার করার জন্য একটি সমান যৌক্তিক কেসটি দেখতে পেয়েছি।

সুতরাং, নিয়মিত এক্সপ্রেশন ইঞ্জিনগুলিতে এই "পুরো জিনিসটি প্রথমে ক্যাপচার করুন" নির্ধারিত আচরণ, বা এটি প্যাটার্ন এবং / অথবা ইঞ্জিনের আচরণের প্রসঙ্গে নির্ভর করবে (সিআর এর চেয়ে পৃথক পিসিআরই জাভা আলাদা হওয়ার চেয়ে আলাদা ছিল) ইত্যাদি))?


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

গ্রুপটি $ 1, $ 2, $ 3 .... ইত্যাদি ব্যবহার করে অ্যাক্সেস করা যায়। কীভাবে দশম গ্রুপ অ্যাক্সেস করবেন? এটি 10 ​​ডলার হবে? আমার মনে হয় না যে 10 ডলার কাজ করবে কারণ এটি 0 ডলার অনুসারে $ 1 হিসাবে ব্যাখ্যা করা হবে এর অর্থ কি আমাদের কেবল সর্বোচ্চ 9 টি গ্রুপ থাকতে পারে? যদি লেখক, দয়া করে এটি প্রশ্নের অংশ হিসাবে অন্তর্ভুক্ত করতে পারেন তবে নিয়মিত অভিব্যক্তিগুলিতে নেস্টেড গোষ্ঠীগুলি সম্পর্কে সমস্ত জানার একক জায়গা হবে।
লায়নহার্ট

উত্তর:


59

Perlrequick থেকে

যদি একটি রেজেক্সে গ্রুপিংগুলি বাসা বেঁধে রাখা হয়, $ 1 বাম দিকের খোলার প্রথম বন্ধনী, the 2 পরবর্তী খোলার প্রথম বন্ধনী ইত্যাদির সাথে গ্রুপ পায় gets

ক্যাভেট : নন-ক্যাপচার গ্রুপ খোলার প্রথম বন্ধনী বাদে (? =)

হালনাগাদ

আমি সাধারণত পিসিআরই বেশি ব্যবহার করি না, যেমন আমি সাধারণত আসল জিনিসটি ব্যবহার করি;), তবে পিসিআরই এর ডক্সগুলি পার্লের মতো দেখায়:

সাব্পটটার্নস

2.এটি ক্যাপচারিং সাবপ্যাটার্ন হিসাবে সাবপ্যাটার্ন সেট আপ করে। এর অর্থ এই যে, যখন পুরো প্যাটার্নটি মেলে, সাবপ্যাটার্নের সাথে মেলে বিষয়টির স্ট্রিংয়ের সেই অংশটি ovectorআর্গুমেন্টের মাধ্যমে কলারের কাছে ফিরে দেওয়া হয় pcre_exec()। ক্যাপচারিং সাবপ্যাটার্নগুলির জন্য নম্বর পেতে খোলার বন্ধনীগুলি বাম থেকে ডানে (1 থেকে শুরু) গণনা করা হয়।

উদাহরণস্বরূপ, যদি স্ট্রিংটি "রেড কিং" প্যাটার্নের সাথে মিলে যায়

the ((red|white) (king|queen))

ধরা পড়া সাবস্ট্রিংগুলি হ'ল "রেড কিং", "রেড" এবং "কিং" এবং যথাক্রমে 1, 2 এবং 3 নম্বরযুক্ত।

যদি পিসিআরই পার্ল রেগেক্স সামঞ্জস্য থেকে দূরে চলেছে, সম্ভবত সংক্ষিপ্ত রূপটি নতুন করে সংজ্ঞায়িত করা উচিত - "পার্ল কগনিট রেগুলার এক্সপ্রেশনস", "পার্ল তুলনীয় নিয়মিত এক্সপ্রেশন" বা অন্য কিছু। বা কেবল অর্থের অক্ষরগুলি ডাইভস্ট করুন।


4
@ সিনান: তিনি পিএইচপি-তে পিসিআরই ব্যবহার করছেন যা "পার্ল-সামঞ্জস্যপূর্ণ নিয়মিত এক্সপ্রেশন"; সুতরাং এটি সরাসরি পার্ল ব্যবহার করার মতোই হওয়া উচিত
পাস্কাল মার্টিন

4
পাস্কল, পিসিআরই পার্ল সামঞ্জস্যপূর্ণ নিয়মিত এক্সপ্রেশন সেট হওয়ার প্রয়াস হিসাবে শুরু হয়েছিল, তবে সাম্প্রতিক বছরগুলিতে দু'জন কিছুটা আলাদা হয়ে গেছে। এখনও খুব অনুরূপ, তবে তেহ উন্নত বৈশিষ্ট্য সেটগুলিতে সূক্ষ্ম পার্থক্য রয়েছে। (এছাড়াও, প্রশ্ন অনুসারে, আমি সমস্ত প্ল্যাটফর্মগুলিতে আগ্রহী)
অ্যালান ঝড়

4
প্রকৃতপক্ষে, এটি পার্ল যা এই দিনগুলিতে বেশিরভাগ "দূরে সরে যাওয়া" করছে, কিন্তু আপনি ঠিক বলেছেন: "পার্ল-সামঞ্জস্যপূর্ণ" দ্রুত একটি ভুল ব্যবহারকারী থেকে একটি সিকুইটুরে পরিবর্তিত হচ্ছে। : ডি
অ্যালান মুর

4
@ অ্যালান, পার্ল অবশ্যই এগিয়ে চলেছেন। P5.10 কয়েকটি জিনিস পরিবর্তন করেছে তবে 6 টি সম্পূর্ণ আলাদা হবে। পি প্রায় অবশ্যই "পার্ল 5" হিসাবে ব্যাখ্যা করা প্রয়োজন। পিসিআরই একটি দুর্দান্ত প্রকল্প, যা আমি যথেষ্ট প্রশংসা করতে পারি না, এটি কয়েকটি প্রকল্পের চেয়ে বেশি গডসেন্ড হয়ে গেছে।
দাওতাড

4
আমি এটি প্রথম উদ্ধৃতি ক্যাভিয়েটের অধীনে যুক্ত করেছি : নন-ক্যাপচার গ্রুপ খোলার বন্ধনী (? =) বাদে। আমি বুঝতে পারি নি যে আমি সম্পাদনা করার সময় লগইন হয়নি। আমি যখন এই মন্তব্যটি যুক্ত করি তখনই আমাকে শংসাপত্রগুলির জন্য জিজ্ঞাসা করা হয়েছিল। সুতরাং, এখন এটি অনুমোদনের জন্য আরও 1 জন ব্যক্তির প্রয়োজন!
জেজিএফএমকে

17

হ্যাঁ, আপনার আগ্রহী সমস্ত ভাষার জন্য এটি বেশ সুন্দরভাবে সংজ্ঞায়িত:

  • জাভা - http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html#cg
    "ক্যাপচারিং গ্রুপগুলি তাদের খোলার প্রথম বন্ধনীগুলি বাম থেকে ডানে গণনা করে গণনা করা হচ্ছে ... গ্রুপ শূন্য সবসময় পুরো এক্সপ্রেশন জন্য দাঁড়িয়েছে। "
  • । নেট - http://msdn.microsoft.com/en-us/library/bs2twtah(VS.71).aspx
    "() ব্যবহার করে ক্যাপচারগুলি প্রথম থেকে প্রথম বন্ধনীর ক্রম অনুসারে স্বয়ংক্রিয়ভাবে গণনা করা হয়। প্রথমটি ক্যাপচার, ক্যাপচার উপাদান সংখ্যা শূন্য, পুরো নিয়মিত প্রকাশের প্যাটার্নের সাথে মেলা পাঠটি "")
  • পিএইচপি (পিসিআরই ফাংশন) - http://www.php.net/manual/en/function.preg-replace.php#function.preg-replace.para امیটার
    "\ 0 বা $ 0 পুরো প্যাটার্নের সাথে মেলে পাঠ্যকে বোঝায়। ক্যাপচারিং সাবপ্যাটার্নের সংখ্যা পেতে খোলার প্রথম বন্ধনীগুলি বাম থেকে ডানে (1 থেকে শুরু) গণনা করা হয় "" (অবজ্ঞাত পসিক্স ফাংশনগুলির ক্ষেত্রেও এটি সত্য ছিল)
  • পিসিআরই - http://www.pcre.org/pcre.txt
    অ্যালান এম যা বলেছিলেন তা যুক্ত করতে "কীভাবে পিসি_এক্সেক () সাবস্ক্রিংগুলি ফিরে আসে" অনুসন্ধান করুন এবং এরপরে পঞ্চম অনুচ্ছেদটি পড়ুন:

    প্রথম জোড়, ওভারেক্টর [0] এবং ওভারেক্টর [1], সনাক্ত করুন
    বিষয়টির স্ট্রিংয়ের অংশটি পুরো প্যাটার্নের সাথে মিলে। পরবর্তী
    জোড় প্রথম ক্যাপচারিং সাবপ্যাটার্ন এবং আরও অনেক কিছুতে ব্যবহৃত হয়। মূল্য
    pcre_exec দ্বারা প্রত্যাবর্তন () সর্বাধিক সংখ্যাযুক্ত জোড়ের চেয়ে একটি is
    সেট করা হয়েছে. উদাহরণস্বরূপ, যদি দুটি সাবস্ট্রিং ক্যাপচার করা হয় তবে
    প্রত্যাশিত মান 3.. যদি কোনও ক্যাপচারিং সাবপ্যাটার্ন না থাকে তবে রিটার্ন
    একটি সফল ম্যাচ থেকে মান 1, এটি সূচিত করে যে কেবল প্রথম জুটি
    অফসেট সেট করা হয়েছে।
    
  • পারেলের আলাদা - http://perldoc.perl.org/perlre.html#
    ক্যাপচার- বুফার্স $ 1, $ 2 ইত্যাদি গ্রুপগুলি ক্যাপচারিং গ্রুপগুলির সাথে মেলে যেমন আপনি প্রত্যাশা করতেন (যেমন বন্ধনী খোলার ঘটনা অনুসারে), তবে $ 0 প্রোগ্রামটির নাম দেয়, না পুরো ক্যোয়ারী স্ট্রিং - এটি ব্যবহার করার জন্য instead & পরিবর্তে।

আপনি সম্ভবত অন্যান্য ভাষার (পাইথন, রুবি এবং অন্যান্য) এর জন্য একই রকমের ফলাফল খুঁজে পাবেন।

আপনি বলে থাকেন যে প্রথমে অভ্যন্তরীণ ক্যাপচার গ্রুপগুলি তালিকাভুক্ত করা সমানভাবে যৌক্তিক এবং আপনি ঠিক বলেছেন - পেরেনস না খোলার পরিবর্তে বন্ধ হওয়ার সূচকের বিষয় হতে পারে। (যদি আমি আপনাকে সঠিকভাবে বুঝতে পারি)। এটি করা কম প্রাকৃতিক যদিও (উদাহরণস্বরূপ এটি পাঠের দিকনির্দেশনা অনুসরণ করে না) এবং এটি কীটপতঙ্গ দ্বারা নির্ধারণ করা আরও কঠিন (সম্ভবত উল্লেখযোগ্যভাবে নয়) তৈরি করে, যা ক্যাপচারিং গ্রুপ একটি নির্দিষ্ট ফলাফল সূচকে থাকবে।

পুরো ম্যাচের স্ট্রিং 0 পজিশনে রাখাও অর্থবোধ করে - বেশিরভাগ ধারাবাহিকতার জন্য। এটি পুরো ম্যাচিং স্ট্রিংটিকে একই সূচীতে থাকতে দেয় রেগেক্স থেকে রেজিজেটে সংখ্যক ক্যাপচারিং গ্রুপ নির্বিশেষে এবং ক্যাপচারিং গ্রুপগুলির সংখ্যা নির্বিশেষে যে কোনও কিছুর সাথে মিলিত হয় (উদাহরণস্বরূপ জাভা প্রতিটি ক্যাপচারিংয়ের সাথে মিলেছে এমন গ্রুপের অ্যারের দৈর্ঘ্যকে ভেঙে ফেলবে) গোষ্ঠী কোনও কন্টেন্টের সাথে মেলে না (উদাহরণস্বরূপ "a (। *) প্যাটার্নের মতো") You , $ 2 ইত্যাদি) (পার্ল অবশ্যই এর একটি খারাপ উদাহরণ, যেহেতু এটি $ & এর সাথে মিলিত অভিব্যক্তির জন্য ব্যবহার করে তবে আপনি ধারণাটি পেয়ে যান :) :)


4
উত্তম উত্তর .. তবে পাইথন (2 এবং 3) আপডেট করার বিষয়ে কীভাবে :-)
জেজিএফএমকে

জাভাস্ক্রিপ্ট কী হবে !?!
মেসেখিব

9

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

এটি আকর্ষণীয় হয়ে ওঠে নামী গোষ্ঠীগুলির সাথে । বেশিরভাগ ক্ষেত্রে, তারা পেরেনগুলির আপেক্ষিক অবস্থানগুলির দ্বারা সংখ্যার একই নীতি অনুসরণ করে - নামটি কেবল সংখ্যার জন্য একটি নাম alias যাইহোক, .NET- এ রেজিজেসগুলিতে নামযুক্ত গোষ্ঠীগুলি সংখ্যাযুক্ত গোষ্ঠীগুলি থেকে পৃথকভাবে গণনা করা হয়। উদাহরণ স্বরূপ:

Regex.Replace(@"one two three four", 
              @"(?<one>\w+) (\w+) (?<three>\w+) (\w+)",
              @"$1 $2 $3 $4")

// result: "two four one three"

বস্তুতপক্ষে, সংখ্যা জন্য একটি alias হয় নাম ; নামী গোষ্ঠীগুলিতে নির্ধারিত সংখ্যাগুলি যেখানে "প্রকৃত" সংখ্যাযুক্ত গ্রুপগুলি ছেড়ে যায় সেখানে শুরু হয়। এটিকে উদ্ভট নীতি হিসাবে মনে হতে পারে তবে এর পিছনে একটি ভাল কারণ রয়েছে: নেট নেটতে আপনি একই গ্রুপের নামটি একবারে পুনরায় ব্যবহার করতে পারবেন can এটি বিভিন্ন স্থানীয় থেকে ফ্লোটিং-পয়েন্ট সংখ্যার সাথে মিলে যাওয়ার জন্য এই থ্রেডের মতো একটি পুনরায় তৈরি করতে সক্ষম করে :

^[+-]?[0-9]{1,3}
(?:
    (?:(?<thousand>\,)[0-9]{3})*
    (?:(?<decimal>\.)[0-9]{2})?
|
    (?:(?<thousand>\.)[0-9]{3})*
    (?:(?<decimal>\,)[0-9]{2})?
|
    [0-9]*
    (?:(?<decimal>[\.\,])[0-9]{2})?
)$

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

এবং তারপরে পার্ল রয়েছে 10.১০+, যা আমাদের করণীয় তার চেয়ে আরও বেশি নিয়ন্ত্রণ দেয় গ্রুপগুলি ক্যাপচারের জন্য। : ডি


4

বাম পেরেনের ক্রমে ক্যাপচার করার ক্রমটি আমি যে সমস্ত প্ল্যাটফর্মে কাজ করেছি তার মধ্যে স্ট্যান্ডার্ড ((পার্ল, পিএইচপি, রুবি, এগ্রিপি)


"বাম প্যারেনের ক্রমে ক্যাপচারিং" এর জন্য ধন্যবাদ, আচরণটি বর্ণনা করার এটি অনেক বেশি সংবেদনশীল উপায়।
অ্যালান ঝড়

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