আমার নিয়মিত প্রকাশটি এক্স-এ কাজ করে তবে Y তে নয়?


76

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

উত্তর:


102

দুর্ভাগ্যক্রমে, reasonsতিহাসিক কারণে, বিভিন্ন সরঞ্জামগুলিতে কিছুটা নিয়মিত অভিব্যক্তি বাক্য গঠন থাকে এবং কখনও কখনও কিছু বাস্তবায়নের এক্সটেনশান থাকে যা অন্যান্য সরঞ্জামগুলি সমর্থন করে না। একটি সাধারণ স্থল রয়েছে, মনে হচ্ছে প্রতিটি সরঞ্জাম লেখক কিছু আলাদা পছন্দ করেছেন।

ফলাফলটি হ'ল যদি আপনার একটি নিয়মিত অভিব্যক্তি থাকে যা একটি সরঞ্জামে কাজ করে, তবে অন্য সরঞ্জামে কাজ করার জন্য আপনাকে এটিকে সংশোধন করতে হবে। সাধারণ সরঞ্জামগুলির মধ্যে প্রধান পার্থক্যগুলি হ'ল:

  • অপারেটরদের +?|(){}একটি ব্যাকস্ল্যাশ প্রয়োজন কিনা ;
  • মূলগুলি .[]*^$এবং সাধারণত সাধারণত কি এক্সটেনশনগুলি সমর্থন করে+?|()

এই উত্তরে আমি প্রধান মানদণ্ডগুলি তালিকাভুক্ত করি । আপনি বিশদগুলির জন্য যে সরঞ্জামগুলি ব্যবহার করছেন তার ডকুমেন্টেশন পরীক্ষা করুন।

উইকিপিডিয়ায় নিয়মিত এক্সপ্রেশন ইঞ্জিনের তুলনাতে সাধারণ প্রয়োগগুলি দ্বারা সমর্থিত বৈশিষ্ট্যগুলির তালিকাতে একটি সারণী রয়েছে।

বেসিক নিয়মিত এক্সপ্রেশন (বিআরই)

বেসিক নিয়মিত এক্সপ্রেশনগুলি পসিক্স স্ট্যান্ডার্ড দ্বারা কোডেড হয় । এটি সিনট্যাক্স দ্বারা ব্যবহৃত grep, sedএবং vi। এই বাক্য গঠনটি নিম্নলিখিত বৈশিষ্ট্যগুলি সরবরাহ করে:

  • ^এবং $কেবল একটি লাইনের শুরু এবং শেষের দিকে মিলবে।
  • . যেকোন চরিত্রের (বা একটি নতুন লাইন বাদে কোনও চরিত্রের সাথে) মিল রয়েছে।
  • […]বন্ধনী (অক্ষর সেট) এর ভিতরে তালিকাভুক্ত যে কোনও একটি অক্ষরের সাথে মেলে। খোলার ব্র্যাকেটের পরে যদি প্রথম অক্ষর a ^হয় তবে তালিকাভুক্ত নয় এমন অক্ষরগুলি পরিবর্তে মিলেছে। একটি অন্তর্ভুক্ত করতে ], এটি খোলার পরে অবিলম্বে রাখুন [(বা পরে [^এটি নেতিবাচক সেট থাকলে)। যদি -দুটি চরিত্রের মধ্যে থাকে তবে এটি একটি ব্যাপ্তি নির্দেশ করে; একটি আক্ষরিক অন্তর্ভুক্ত করতে -, যেখানে এটি ব্যাপ্তি হিসাবে বিভক্ত করা যায় না সেখানে রাখুন।
  • ^$.*\[পরবর্তী অক্ষরটির যে কোনও উদ্ধৃতি দেওয়ার আগে ব্যাকস্ল্যাশ ।
  • * পূর্ববর্তী অক্ষর বা সুপ এক্সপ্রেশন 0, 1 বা তার বেশি বারের সাথে মেলে।
  • \(…\)*অপারেটর বা ব্যাকরেফারেন্স এবং \DIGITপ্রতিস্থাপনের সাথে ব্যবহারের জন্য একটি সিনট্যাকটিক গ্রুপ ।
  • Backreferences \1, \2... যথাযথ পাঠ সংশ্লিষ্ট গ্রুপ দ্বারা মেলানো, যেমন মেলে \(fo*\)\(ba*\)\1ম্যাচ foobaafooকিন্তু foobaafo। দশম গ্রুপ এবং এর বাইরে উল্লেখ করার কোনও মানক উপায় নেই (এর মানক মানে \10প্রথম গ্রুপটি এর পরে একটি 0)।

নিম্নলিখিত বৈশিষ্ট্যগুলি মানকও, তবে কিছু সীমাবদ্ধ বাস্তবায়ন থেকে অনুপস্থিত:

  • \{m,n\}পূর্ববর্তী অক্ষর বা মধ্যবর্তী subexpression সাথে মিলে যায় মি থেকে এন বার; n বা m বাদ দেওয়া যেতে পারে এবং এর অর্থ হ'ল মি\{m\}
  • ব্র্যাকেটের ভিতরে অক্ষর ক্লাস ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ যে [[:alpha:]]কোনও বর্ণের সাথে মেলে। ব্র্যাকেট এক্সপ্রেশনগুলির আধুনিক বাস্তবায়নগুলি ) এর মতো এবং সমতুল্য শ্রেণীর মতো কোলটিং উপাদানগুলি অন্তর্ভুক্ত করে ।[.ll.][=a=]

নিম্নলিখিতগুলি সাধারণ এক্সটেনশনগুলি (বিশেষত জিএনইউ সরঞ্জামগুলিতে) রয়েছে তবে সমস্ত প্রয়োগে সেগুলি পাওয়া যায় না। আপনি যে সরঞ্জামটি ব্যবহার করছেন তার ম্যানুয়ালটি পরীক্ষা করুন।

  • \|বিকল্প জন্য: foo\|barম্যাচ fooবা bar
  • \?(সংক্ষিপ্ত জন্য \{0,1\}) এবং \+(সংক্ষিপ্ত জন্য \{1,\}) পূর্ববর্তী অক্ষর বা স্যুব এক্সপ্রেসনের সাথে সর্বাধিক 1 সময়ে, বা যথাক্রমে কমপক্ষে 1 বারের সাথে মেলে।
  • \nএকটি নতুন লাইন \tমেলে, একটি ট্যাবের সাথে মেলে, ইত্যাদি
  • \wকোনও শব্দের [_[:alnum:]]घटकের সাথে মেলে ( স্থানীয়করণের ক্ষেত্রে এটির জন্য সংক্ষিপ্তরতার সাথে সংক্ষিপ্তসার থাকলেও) এবং \Wএমন কোনও চরিত্রের সাথে মেলে যা কোনও শব্দ উপাদান নয়।
  • \<এবং \>কেবলমাত্র শব্দের শুরু বা শেষে যথাক্রমে খালি স্ট্রিংটি মেলে; \bহয় মেলে, এবং \Bমেলে যেখানে \bনা।

নোট করুন অপারেটরবিহীন সরঞ্জামগুলিতে \|নিয়মিত এক্সপ্রেশনগুলির সম্পূর্ণ ক্ষমতা নেই। ব্যাকরিফারেন্সগুলি কয়েকটি অতিরিক্ত জিনিসকে মঞ্জুরি দেয় যা গাণিতিক অর্থে নিয়মিত প্রকাশের সাথে সম্পন্ন করা যায় না।

বর্ধিত নিয়মিত এক্সপ্রেশন (ERE)

প্রসারিত নিয়মিত এক্সপ্রেশনগুলি পসিক্স স্ট্যান্ডার্ড দ্বারা কোডিং করা হয় । BRE- র ক্ষেত্রে তাদের প্রধান সুবিধা হ'ল নিয়মিততা: সমস্ত স্ট্যান্ডার্ড অপারেটরগুলি বিরামচিহ্ন অক্ষর, বিরামচিহ্নের অক্ষর সর্বদা এটির উদ্ধৃতি দেওয়ার আগে একটি ব্যাকস্ল্যাশ। এগুলি এটিকে ব্যবহার সিনট্যাক্স হল awk, grep -Eবা egrepগনুহ, sed -rএবং ব্যাশ এর=~ অপারেটর। এই বাক্য গঠনটি নিম্নলিখিত বৈশিষ্ট্যগুলি সরবরাহ করে:

  • ^এবং $কেবল একটি লাইনের শুরু এবং শেষের দিকে মিলবে।
  • . যেকোন চরিত্রের (বা একটি নতুন লাইন বাদে কোনও চরিত্রের সাথে) মিল রয়েছে।
  • […]বন্ধনী (অক্ষর সেট) এর ভিতরে তালিকাভুক্ত যে কোনও একটি অক্ষরের সাথে মেলে। প্রাথমিক ^এবং ব্যাপ্তিগুলির সাথে পরিপূরকতা BRE- র মতো কাজ করে (উপরে দেখুন)। চরিত্রের ক্লাসগুলি ব্যবহার করা যেতে পারে তবে কয়েকটি বাস্তবায়ন থেকে অনুপস্থিত। আধুনিক প্রয়োগগুলি সমতা শ্রেণি এবং কোলটিং উপাদানগুলিকে সমর্থন করে। বন্ধনীগুলির মধ্যে একটি ব্যাকস্ল্যাশ কিছুতে পরবর্তী চরিত্রের উদ্ধৃতি দেয় তবে সমস্ত বাস্তবায়ন হয় না; \\বহনযোগ্যতার জন্য একটি ব্যাকস্ল্যাশ বোঝাতে ব্যবহার করুন ।
  • (…)ব্যবহার *বা \DIGITপ্রতিস্থাপনের জন্য একটি সিনট্যাকটিক গ্রুপ ।
  • |বিকল্প জন্য: foo|barম্যাচ fooবা bar
  • *, +এবং ?পূর্বের চরিত্রের সাথে মিলিত হয় বা বেশ কয়েকবার স্যুপ এক্সপ্রেসনের সাথে: 0 বা আরও বেশি *, 1 বা আরও বেশি +, 0 বা 1 এর জন্য ?
  • ব্যাকস্ল্যাশ পরবর্তী অক্ষরটি যদি বর্ণমালা না হয় তবে উদ্ধৃত করে।
  • {m,n}পূর্বের চরিত্রের সাথে মি বা মি এবং এন সময়ের মধ্যে স্যুপ এক্সপ্রেশন (কিছু প্রয়োগ থেকে অনুপস্থিত); n বা m বাদ দেওয়া যেতে পারে এবং এর অর্থ হ'ল মি{m}
  • কিছু সাধারণ এক্সটেনশান যেমন বিআরই: ব্যাকরেফারেন্সস (ব্যস্তবক্স বাস্তবায়ন যেখানে আপনি ব্যবহার করতে পারেন ব্যতীত বিশ্রীভাবে অনুপস্থিত ); বিশেষ অক্ষর , ইত্যাদি; শব্দ সীমানা এবং , শব্দ উপাদান এবং ,…\DIGIT$0 ~ "(...)\\1"\n\t\b\B\b\B

পিসিআরই (পার্ল-সামঞ্জস্যপূর্ণ নিয়মিত প্রকাশ)

পিসিআরই হ'ল ইআর এর এক্সটেনশানগুলি মূলত পার্ল দ্বারা প্রবর্তিত এবং জিএনইউ grep -Pএবং অনেকগুলি আধুনিক সরঞ্জাম এবং প্রোগ্রামিং ভাষা সাধারণত পিসিআর লাইব্রেরির মাধ্যমে গৃহীত হয় । উদাহরণ সহ সুন্দর বিন্যাসের জন্য পার্ল ডকুমেন্টেশন দেখুন । পার্লের সর্বশেষ সংস্করণটির সমস্ত বৈশিষ্ট্যগুলি পিসিআরই দ্বারা সমর্থিত নয় (যেমন পার্ল কোড এক্সিকিউশনটি কেবল পার্লে সমর্থিত)। সমর্থিত বৈশিষ্ট্যের সংক্ষিপ্তসার জন্য পিসিআরই ম্যানুয়াল দেখুন । পূর্বের মূল সংযোজনগুলি হ'ল:

  • (?:…)একটি নন-ক্যাপচারিং গ্রুপ: লাইক (…), তবে ব্যাক-রেফারেন্সের জন্য গণনা করে না।
  • (?=FOO)BAR(lookahead) ম্যাচ BAR, তবে FOOএকই অবস্থান থেকে শুরু করার জন্য যদি কোনও ম্যাচ থাকে তবেই । ম্যাচের নিম্নলিখিত পাঠ্যগুলি অন্তর্ভুক্ত না করে ম্যাচটি অ্যাঙ্কর করা সবচেয়ে কার্যকর: foo(?=bar)ম্যাচগুলি fooতবে তা অনুসরণ করা হয় bar
  • (?!FOO)BAR(নেতিবাচক চেহারা) ম্যাচ BAR, কিন্তু FOOএকই পজিশনে কোনও ম্যাচও নেই । উদাহরণস্বরূপ (?!foo)[a-z]+কোনও ছোট হাতের শব্দের সাথে মেলে যা শুরু হয় না foo; [a-z]+(?![0-9)কোনও সংখ্যার ছোট হাতের শব্দের সাথে মেলে যা কোনও অঙ্কের পরে হয় না (সুতরাং foo123এটির সাথে এটি মিলছে foতবে মিলবে না foo)।
  • (?<=FOO)BAR(lookbehind) ম্যাচগুলি BARতবে এটির সাথে সাথে কোনও ম্যাচ আগেই হয় FOOFOOঅবশ্যই একটি জ্ঞাত দৈর্ঘ্য থাকতে হবে (আপনি পুনরাবৃত্তি অপারেটরগুলি ব্যবহার করতে পারবেন না *)। ম্যাচের পূর্ববর্তী পাঠ্যকে অন্তর্ভুক্ত না করে ম্যাচটি অ্যাঙ্কর করার জন্য এটি সবচেয়ে দরকারী: (?<=^| )fooম্যাচগুলি fooকেবল তবে এটির স্থান বা স্ট্রিংয়ের শুরুতে পূর্ববর্তী হলে।
  • (?<!FOO)BAR(নেগেটিভ লুকবিহাইন্ড) ম্যাচ করে BARতবে কেবলমাত্র যদি এর সাথে ম্যাচটি তত্ক্ষণাত্ আগে না হয় FOOFOOঅবশ্যই একটি জ্ঞাত দৈর্ঘ্য থাকতে হবে (আপনি পুনরাবৃত্তি অপারেটরগুলি ব্যবহার করতে পারবেন না *)। ম্যাচের পূর্ববর্তী পাঠ্য না রেখে ম্যাচটি অ্যাঙ্কর করার জন্য এটি সবচেয়ে দরকারী: (?<![a-z])fooম্যাচগুলি fooতবে এটি ছোট হাতের অক্ষরের আগে না থাকলেই হয়।

এ গিয়ে emacs

ইমাক্সের বাক্য গঠনটি বিআরই এবং ইআর এর মধ্যে মধ্যবর্তী হয়। ইমা্যাকস ছাড়াও, এটি -regexজিএনইউ অনুসন্ধানে ডিফল্ট সিনট্যাক্স । ইমাকস নিম্নলিখিত অপারেটরদের প্রস্তাব:

  • ^, $, ., […], *, +, ?Ere হিসেবে
  • \(…\), \|, \{…\}, BrE তে যেমন\DIGIT
  • আরও ব্যাকস্ল্যাশ-লেটার ক্রম ; \<এবং \>শব্দ সীমা জন্য; এবং আরও অনেকগুলি ইমা্যাক্সের সাম্প্রতিক সংস্করণগুলিতে, যা প্রায়শই অন্যান্য ইঞ্জিনগুলিতে ইমাক্স-এর মতো সিনট্যাক্স সহ সমর্থিত হয় না।

শেল গ্লোবস

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

  • ? কোনও একক চরিত্রের সাথে মেলে।
  • […]সাধারণ নিয়মিত অভিব্যক্তি সিনট্যাক্সের মতো একটি চরিত্র সেট। কিছু শেল অক্ষর শ্রেণীর জন্য সমর্থন করে না। কিছু শেল সেট উপেক্ষা করার !পরিবর্তে প্রয়োজন ^
  • *অক্ষরের যে কোনও অনুক্রমের সাথে মেলে (প্রায়শই /ফাইল পাথের সাথে মিলের সময় ব্যতীত ; যদি /এ থেকে বাদ দেওয়া হয় *তবে **মাঝে মাঝে অন্তর্ভুক্ত থাকে /তবে সরঞ্জামটির ডকুমেন্টেশন পরীক্ষা করুন)।
  • ব্যাকস্ল্যাশ পরবর্তী চরিত্রটি উদ্ধৃত করে।

Ksh অতিরিক্ত বৈশিষ্ট্যগুলি সরবরাহ করে যা নিয়মিত এক্সপ্রেশনগুলির সম্পূর্ণ শক্তির সাথে এর প্যাটার্নটি মেলে। এই বৈশিষ্ট্যগুলি দৌড়ানোর পরে ব্যাশে পাওয়া যায় shopt -s extglob। Zsh এর আলাদা সিনট্যাক্স রয়েছে তবে ksh এর সিনট্যাক্স পরে সমর্থন করতে পারে setopt ksh_glob


আপনি যে অন্যান্য সমৃদ্ধ আরইও উল্লেখ করতে চাইতে পারেন তা vimহ'ল এটি এবং এটি অ্যান্ড টি লাইবাস্ট (যেমন রয়েছে ksh93)।
স্টাফেন চেজেলাস

@ স্টাফেনচাজলাস ভিএম ছাড়াও কোন প্রোগ্রামটি ভিএম রিজেক্সপস ব্যবহার করে? Ksh ব্যতীত কোন প্রোগ্রামটি লাইবস্ট ব্যবহার করে?
গিলস

যেমন AT & T টুল সেটের সব যেমন AT & T মাঝামাঝি (ব্যবহার grep, tw, expr...)। বাদে ksh, এই টুলসেটটি খুব কমই যদিও এটিএন্ডটিটির বাইরে পাওয়া যায়।
স্টাফেন চেজেলাস

আমার বোঝার (এবং উইকিপিডিয়া) অনুসারে, আপনার "ক্যারেক্টার ক্লাস" শব্দটি আসলে "পসিক্স অক্ষর শ্রেণি" বোঝায় ... তবে regex(7)আপনার সাথে একমত হয় এবং [these]"ব্র্যাকেট এক্সপ্রেশন" এবং ("বন্ধনী" এর ভিতরে ") [:these:]" চরিত্রের শ্রেণিগুলিকে কল করে। " আমি কীভাবে সুনির্দিষ্টভাবে সম্বোধন করব তা নিশ্চিত নই।
অ্যাডাম কাটজ

আপনি তাদের যাই বলুন না কেন, তারা ব্যাপ্তি সমর্থন করে। এটি অবশ্যই লক্ষণীয় যে এটি -একটি ব্যাপ্তি নির্দিষ্ট করে এবং তা পালাতে হবে, প্রথমে (afterচ্ছিকের পরে ^), বা এটি আক্ষরিকভাবে গ্রহণ করতে গেলে শেষ অবধি। (আমি প্রচুর বাগ দেখতে পেয়েছি যেমন, উদাহরণস্বরূপ – [A-z]নোটের পরিবর্তনের লক্ষ্যে from যা কোডের বর্ণগুলি 65 থেকে 122 এর সাথে মেলে এবং ঘটনাক্রমে প্রতিটিটি অন্তর্ভুক্ত করে: [\]^_`আমি [!-~]এএনএসআই-তে সমস্ত মুদ্রণযোগ্য অক্ষরগুলির সাথে মিলিয়ে বৈধ এখনও বিভ্রান্ত দেখতে পেয়েছি I've , যা আমি দেখতে পছন্দ করি [\x21-\x7e], যা ভিন্ন ভিন্ন মাত্রায় বিভ্রান্ত হওয়া সত্ত্বেও তার ক্রিয়ায় অন্তত সোজা
অ্যাডাম কাটজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.