এইচটিএমএল / এক্সএমএলকে পার্স করার জন্য কেন রেজেক্স ব্যবহার করা সম্ভব নয়: সাধারণ লোকের পদগুলিতে একটি আনুষ্ঠানিক ব্যাখ্যা


117

এসও-তে কোনও দিন নেই যা নিয়মিত প্রকাশের সাথে জিজ্ঞাসা করা (এক্স) এইচটিএমএল বা এক্সএমএলকে পার্সিং সম্পর্কিত প্রশ্ন ছাড়াই কেটে যায়।

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

এই সাইটে আমি এখন পর্যন্ত কেবলমাত্র একমাত্র আনুষ্ঠানিক ব্যাখ্যার সন্ধান পেয়েছি এটি সম্ভবত অত্যন্ত সঠিক, তবে স্ব-শিক্ষিত প্রোগ্রামারটির কাছে বেশ রহস্যজনক:

এখানে ত্রুটিটি হ'ল এইচটিএমএলটি একটি চমস্কি টাইপ 2 ব্যাকরণ (প্রসঙ্গমুক্ত ব্যাকরণ) এবং রেজিএক্স একটি চমস্কি টাইপ 3 ব্যাকরণ (নিয়মিত প্রকাশ)

বা:

নিয়মিত প্রকাশগুলি কেবল নিয়মিত ভাষার সাথেই মেলে তবে এইচটিএমএল একটি প্রসঙ্গ-মুক্ত ভাষা।

বা:

একটি সসীম অটোমেটন (যা নিয়মিত প্রকাশের অন্তর্ভুক্ত ডেটা স্ট্রাকচার) এতে থাকা রাষ্ট্রটি ছাড়া স্মৃতিশক্তি থাকে না এবং যদি আপনি নির্বিচারে গভীর বাসা বাঁধেন তবে আপনার একটি নির্বিচারে বৃহত অটোমেটোন দরকার যা একটি সীমাবদ্ধ অটোমেটনের ধারণার সাথে সংঘর্ষ করে।

বা:

নিয়মিত ভাষার জন্য পাম্পিং লেমমা হ'ল আপনি এটি করতে না পারার কারণ।

[নিখুঁতভাবে: উপরের ব্যাখ্যাটির বেশিরভাগটি উইকিপিডিয়া পৃষ্ঠাগুলিতে লিঙ্ক, তবে এগুলি নিজের উত্তরগুলির চেয়ে বোঝা খুব সহজ নয়]।

সুতরাং আমার প্রশ্নটি হল: কেউ দয়া করে উপরে বর্ণিত আনুষ্ঠানিক ব্যাখ্যার সাধারণ ব্যক্তির শর্তাবলী একটি অনুবাদ প্রদান করতে পারেন কেন পার্সিং (এক্স) এইচটিএমএল / এক্সএমএল জন্য রেজেক্স ব্যবহার করা সম্ভব হচ্ছে না?

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


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

1
@ বার্ট: এটি কেবলমাত্র সেই ভাষাগুলির ক্ষেত্রেই প্রযোজ্য যা "নিয়মিত অভিব্যক্তি" শব্দের অপব্যবহার করে। পসিক্স ইআর নিখুঁতভাবে নিয়মিত
আর .. গিথহাব স্টপ হেল্পিং আইসিসি

2
@ আর .., সুতরাং, আপনি পসিক্সকে "আধুনিক দিনের বাস্তবায়ন" বলেছেন: পি। সব গম্ভীরতা ইন যদিও: হ্যাঁ, আপনি সঠিক ঐ সত্যিই করছি হয় নিয়মিত। আমার বলা উচিত ছিল ... "আধুনিক যুগের অনেকগুলি রেগেক্স বাস্তবায়ন ..." বা "... পিসিআরই রেজেক্স বাস্তবায়ন ..."
বার্ট কায়ার্স

4
অজানা প্রোগ্রামারদের কাছে বিপণনের স্বার্থে মৌলিকভাবে কঠোর ভাষার অপব্যবহার করা গুরুত্ব সহকারে প্রোগ্রামিং ভাষাগুলি গ্রহণ করা আমার পক্ষে খুব কঠিন ...
আর .. গিটিহাব স্টপ হেল্পিং আইসিসি

3
@ আর .., এটি দুর্ভাগ্যজনক যে পিসিআরই-বাস্তবায়নগুলি "নিয়মিত অভিব্যক্তি" হিসাবে উল্লেখ করা হয়, তবে ভাষাটিকে গুরুত্বের সাথে না নিয়ে একে একে আরও দূরে নিয়ে যাওয়া হয়, আইএমও। আমি বলতে চাইছি, আপনি কি পার্ল, জাভা, পাইথন, রুবি, জাভাস্ক্রিপ্ট,। নেট, ইত্যাদি গ্রহণ করছেন না এর কারণে?
বার্ট কায়ার্স

উত্তর:


117

এটিতে মনোনিবেশ করুন:

একটি সসীম অটোমেটন (যা নিয়মিত প্রকাশের অন্তর্ভুক্ত ডেটা স্ট্রাকচার) এতে থাকা রাষ্ট্রটি ছাড়া স্মৃতিশক্তি থাকে না এবং যদি আপনি নির্বিচারে গভীর বাসা বাঁধেন তবে আপনার একটি নির্বিচারে বৃহত অটোমেটোন দরকার যা একটি সীমাবদ্ধ অটোমেটনের ধারণার সাথে সংঘর্ষ করে।

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

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

তবে নোট করুন যে বেশিরভাগ "রেজেক্স" লাইব্রেরিগুলি নিয়মিত এক্সপ্রেশনগুলির কঠোর সংজ্ঞা ছাড়াও আরও বেশি অনুমতি দেয়। যদি তারা ব্যাক-রেফারেন্সগুলি মেলতে পারে তবে তারা একটি নিয়মিত ভাষার বাইরে চলে গেছে। সুতরাং যে কারণে আপনি এইচটিএমএলে একটি রেজেক্স লাইব্রেরি ব্যবহার করবেন না সে কারণটি এইচটিএমএল নিয়মিত নয় তার চেয়ে একটু জটিল।


এখানে সসীম রাষ্ট্রের
অটোমেটারের

55

এইচটিএমএলটি নিয়মিত ভাষার প্রতিনিধিত্ব করে না এটি একটি লাল রঙের হেরিং ring নিয়মিত প্রকাশ এবং নিয়মিত ভাষাগুলি ধরণের ধরণের অনুরূপ , তবে তা নয় - এগুলি একই উত্সটি ভাগ করে, তবে একাডেমিক "নিয়মিত ভাষা" এবং ইঞ্জিনগুলির বর্তমান মিলের শক্তির মধ্যে একটি উল্লেখযোগ্য দূরত্ব রয়েছে। আসলে, প্রায় সমস্ত আধুনিক নিয়মিত এক্সপ্রেশন ইঞ্জিনগুলি নিয়মিত বৈশিষ্ট্যগুলিকে সমর্থন করে - একটি সাধারণ উদাহরণ (.*)\1। যা অক্ষরগুলির পুনরাবৃত্ত ক্রমের সাথে মিল রাখতে ব্যাক-রেফারেন্সিং ব্যবহার করে - উদাহরণস্বরূপ 123123, বা bonbon। পুনরাবৃত্ত / ভারসাম্যপূর্ণ কাঠামোগুলির মিল এগুলি আরও মজাদার করে তোলে।

উইকিপিডিয়া এটিকে লরি ওয়াল দ্বারা উদ্ধৃত করে বলেছেন :

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

"নিয়মিত প্রকাশটি কেবল নিয়মিত ভাষার সাথেই মেলে", আপনি দেখতে পাচ্ছেন যে সাধারণভাবে বর্ণিত মিথ্যাচারের চেয়ে বেশি কিছুই নয়।

তো, তাহলে কেন হবে না?

এইচটিএমএলকে নিয়মিত অভিব্যক্তির সাথে মিল না দেওয়ার একটি ভাল কারণ হ'ল "আপনার কারণটি বোঝানো উচিত নয়" " যদিও সম্ভব হতে পারে - কাজের জন্য আরও ভাল সরঞ্জাম রয়েছে । বিবেচনা করা:

  • বৈধ এইচটিএমএল আপনার ভাবার চেয়ে কঠিন / আরও জটিল।
  • অনেক ধরণের "বৈধ" HTML রয়েছে - যা এইচটিএমএলে বৈধ, উদাহরণস্বরূপ, এক্সএইচটিএমএলে বৈধ নয় valid
  • ইন্টারনেটে পাওয়া ফ্রি-ফর্ম HTML এর বেশিরভাগ অংশই যাইহোক বৈধ নয় । এইচটিএমএল লাইব্রেরিগুলি এগুলিও পরিচালনা করার জন্য একটি ভাল কাজ করে এবং এগুলি অনেকগুলি সাধারণ ক্ষেত্রে পরীক্ষা করা হয়েছিল।
  • প্রায়শই এটি সম্পূর্ণরূপে বিশ্লেষণ না করে ডেটার একটি অংশের সাথে মিল পাওয়া অসম্ভব। উদাহরণস্বরূপ, আপনি সমস্ত শিরোনাম সন্ধান করছেন এবং কোনও মন্তব্য বা একটি স্ট্রিং আক্ষরিকের সাথে মিল রেখে শেষ করতে পারেন। <h1>.*?</h1>মূল শিরোনাম সন্ধানের জন্য সাহসের চেষ্টা হতে পারে তবে এটি সন্ধান করতে পারে:

    <!-- <h1>not the title!</h1> -->

    অথবা এমনকি:

    <script>
    var s = "Certainly <h1>not the title!</h1>";
    </script>

শেষ পয়েন্টটি সর্বাধিক গুরুত্বপূর্ণ:

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

বিষয়টির একটি ভাল সংক্ষিপ্তসার এবং রেজেজ এবং এইচটিএমএল মিশ্রণের সময় একটি গুরুত্বপূর্ণ মন্তব্য জেফ অ্যাটউডের ব্লগে পাওয়া যাবে: এইচটিএমএল দ্য চথুলহু ওয়েতে পার্সিং করা

এইচটিএমএল পার্স করার জন্য কখন নিয়মিত এক্সপ্রেশন ব্যবহার করা ভাল?

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

এর মধ্যে কয়েকটি শর্ত দেওয়া:

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

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

1
@ ম্যাক - অনেক ধন্যবাদ আসলে, আমি এটি কিছু চিন্তা দিয়েছিলাম। আমি জানি যে আমি আপনার প্রশ্নের উত্তর দিইনি, তবে আমি মনে করি না যে প্রশ্নটি মূলত সঠিক - আপনি ভুল কারণটি ব্যাখ্যা করতে বলেছিলেন ... যদিও আপনার একটি ভাল ধারণা রয়েছে, সম্ভবত অন্য প্রশ্নটি আরও উপযুক্ত ...
কোবি

19

কারণ এইচটিএমএল এর সীমাহীন বাসা থাকতে পারে <tags><inside><tags and="<things><that><look></like></tags>"></inside></each></other>এবং রিজেক্স সত্যিই এটি মোকাবেলা করতে পারে না কারণ এটি কীভাবে নেমেছে এবং কী থেকে বেরিয়ে আসে তার কোনও ইতিহাস ট্র্যাক করতে পারে না।

একটি সাধারণ নির্মাণ যা অসুবিধার চিত্রিত করে:

<body><div id="foo">Hi there!  <div id="bar">Bye!</div></div></body>

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


1
উত্তরটির প্রশংসা করুন, তবে আমার প্রশ্নটি "আমি কেন রেজেক্স ব্যবহার করতে পারি না ..."। আমার প্রশ্নটি আমি যে রীতিমতো ব্যাখ্যা দিয়েছি তা "অনুবাদ" সম্পর্কে! :)
ম্যাক

5
এটি কিছুটা অর্থে এগুলির একটি অনুবাদ, বেশিরভাগ অনুমান "নিয়মিত প্রকাশগুলি কেবল নিয়মিত ভাষার সাথেই মেলে তবে এইচটিএমএল একটি প্রসঙ্গ-মুক্ত ভাষা" এবং সীমাবদ্ধ অটোমেটা সম্পর্কিত একটি। এটি সত্যই একই কারণ।
ইয়ানুস চায়ারস্কুরো

দুঃখিত, সম্ভবত আমি আমার প্রশ্নে পরিষ্কার ছিলাম না (এটি উন্নত করার জন্য পরামর্শগুলি স্বাগত!)। তবে আমি একটি উত্তর খুঁজছি যা "অনুবাদ" ব্যাখ্যা করে। আপনার উত্তরটি 'নিয়মিত ভাষা' বা 'প্রসঙ্গ-মুক্ত ভাষা' ধারণাগুলি পরিষ্কার করে না ...
ম্যাক

5
এই শর্তাদি ব্যাখ্যা করা জারজান নিজেই যেমন প্রযুক্তিগত হবে এবং সমস্ত নির্ভুল ভাষা যে আসল অর্থটি পেয়েছে তা হ'ল আমি যে পোস্ট করেছি।
ইয়ানুস চায়ারস্কুরো

4
<(\w+)(?:\s+\w+="[^"]*")*>(?R)*</\1>|[\w\s!']+আপনার কোড নমুনার সাথে মেলে।
কোবি

9

একটি নিয়মিত ভাষা এমন একটি ভাষা যা একটি সীমাবদ্ধ রাষ্ট্রের মেশিনের সাথে মিলে যায়।

(সীমাবদ্ধ স্টেট মেশিন, পুশ-ডাউন মেশিন এবং ট্যুরিং মেশিনগুলি বোঝা মূলত চতুর্থ বর্ষের কলেজ সিএস কোর্সের পাঠ্যক্রম।)

নিম্নলিখিত মেশিনটি বিবেচনা করুন, যা "হাই" স্ট্রিংকে স্বীকৃতি দেয়।

(Start) --Read h-->(A)--Read i-->(Succeed)
  \                  \
   \                  -- read any other value-->(Fail) 
    -- read any other value-->(Fail)

এটি একটি নিয়মিত ভাষা শনাক্ত করার জন্য একটি সাধারণ মেশিন; প্রথম বন্ধনীর প্রতিটি অভিব্যক্তি একটি রাষ্ট্র এবং প্রতিটি তীর একটি রূপান্তর। এই জাতীয় মেশিন তৈরি করা আপনাকে নিয়মিত ভাষার বিরুদ্ধে কোনও ইনপুট স্ট্রিং পরীক্ষা করতে দেয় - সুতরাং, একটি নিয়মিত প্রকাশ।

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


2
"সীমাবদ্ধ স্টেট মেশিন, পুশ-ডাউন মেশিন এবং ট্যুরিং মেশিনগুলি বোঝা মূলত 300-স্তরের সিএস কোর্সের পাঠ্যক্রম।" আমি বুঝতে পেরেছি বিষয়টি কতটা কঠিন / অগ্রসর করার তা বোঝানোর এটি একটি প্রয়াস, তবে আপনি যে স্কুল ব্যবস্থাটির কথা উল্লেখ করছেন তার সাথে আমি অপরিচিত, আপনি কি দয়া করে কোনও দেশ-নির্দিষ্ট উপায়ে স্পষ্ট করে বলতে পারেন? ধন্যবাদ! :)
ম্যাক

1
আমি এটি আপডেট করেছি। আমি জানি না যে এটি বোঝা খুব কঠিন, কেবল স্ট্যাক ওভারফ্লো পোস্টে ব্যাখ্যা করা।
শান ম্যাকমিলান

6

একটি নিয়মিত প্রকাশটি একটি মেশিন যা একটি সীমাবদ্ধ (এবং সাধারণত ছোট) সংখ্যক পৃথক অবস্থায় রয়েছে।

এক্সএমএল, সি বা অন্য যে কোনও ভাষার পার্থক্য করার জন্য ভাষা উপাদানগুলির নির্বিচারে বাসা বাঁধতে আপনার কতটা গভীর তা মনে রাখা দরকার। এটি হ'ল, আপনাকে অবশ্যই ব্রেস / বন্ধনী / ট্যাগ গণনা করতে সক্ষম হতে হবে।

সসীম স্মৃতি দিয়ে আপনি গণনা করতে পারবেন না। আপনার রাজ্যের চেয়ে আরও বেশি ধনুর্বন্ধনী স্তর থাকতে পারে! আপনি আপনার ভাষার একটি উপসেট পার্স করতে সক্ষম হতে পারেন যা বাসা বাঁধার মাত্রাগুলিকে সীমাবদ্ধ করে, তবে এটি খুব ক্লান্তিকর হবে।


6

ব্যাকরণ হ'ল শব্দগুলি কোথায় যেতে পারে তার একটি আনুষ্ঠানিক সংজ্ঞা। উদাহরণস্বরূপ, বিশেষণ বিশেষ্যগুলি বিশেষ্য ব্যবহার করে in English grammarতবে বিশেষ্যগুলি বিশেষ্যগুলি অনুসরণ করেen la gramática española । প্রসঙ্গমুক্ত অর্থ ব্যাকরণ সমস্ত প্রসঙ্গে সর্বজনীনভাবে। প্রসঙ্গ-সংবেদনশীল অর্থ নির্দিষ্ট প্রসঙ্গে অতিরিক্ত নিয়ম রয়েছে।

C #, উদাহরণস্বরূপ, usingমধ্যে ভিন্ন কিছু মানে using System;ফাইল উপরের চেয়ে এ using (var sw = new StringWriter (...))। আরও প্রাসঙ্গিক উদাহরণ কোডের মধ্যে নিম্নলিখিত কোড:

void Start ()
{
    string myCode = @"
    void Start()
    {
       Console.WriteLine (""x"");
    }
    ";
}

এটি বোধগম্য উত্তর
একজন ব্যক্তি

তবে প্রসঙ্গমুক্ত বলতে নিয়মিত বোঝায় না। ম্যাচিং প্যারান্থেসিসের ভাষা প্রসঙ্গমুক্ত, তবে নিয়মিত নয়।
তাইমির

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

4

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

উদাহরণস্বরূপ, এটি সমস্ত খুব ভালভাবে মেলে একটি নিয়মিত প্রকাশ প্রকাশ করে

<price>10.65</price>

তবে যদি আপনার কোডটি সঠিক হতে হয় তবে:

  • এটি অবশ্যই শুরু এবং শেষ উভয় ট্যাগের এলিমেন্ট নামের পরে শ্বেতস্পেসের অনুমতি দিতে হবে

  • যদি দস্তাবেজটি একটি নেমস্পেসে থাকে, তবে এটি কোনও নাম স্থান উপসর্গ ব্যবহার করার অনুমতি দেওয়া উচিত

  • এটি সম্ভবত শুরুর ট্যাগটিতে উপস্থিত কোনও অজানা বৈশিষ্ট্যগুলিকে অনুমতি দেওয়া এবং এড়ানো উচিত (নির্দিষ্ট শব্দভাণ্ডারের শব্দার্থের উপর নির্ভর করে)

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

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

  • যদি ইনপুটটি অবৈধ থাকে তবে ডায়াগনস্টিকগুলি সরবরাহ করতে হবে।

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


2

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

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

উদাহরণস্বরূপ বিবেচনা করুন,

(?:
    <!\-\-[\S\s]*?\-\->
    |
    <([\w\-\.]+)[^>]*?
    (?:
        \/>
        |
        >
        (?:
            [^<]
            |
            (?R)
        )*
        <\/\1>
    )
)

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

এখানে কিভাবে এটা কাজ করে:

  1. প্রথম অংশটি একটি মন্তব্যে মেলে। এটি প্রথমে আসার জন্য এটি প্রয়োজনীয় যাতে এটি কোনও মন্তব্য-আউট কোডের সাথে ডিল করবে যা অন্যথায় হ্যাং আপের কারণ হতে পারে।
  2. যদি এটি মেলে না, এটি ট্যাগের শুরুতে সন্ধান করবে। মনে রাখবেন যে এটি নাম ক্যাপচার করার জন্য বন্ধনী ব্যবহার করে।
  3. এই ট্যাগটি হয় একটিতে শেষ হয় />, এইভাবে ট্যাগটি সম্পূর্ণ করে, বা এটি দিয়ে শেষ হবে> , এক্ষেত্রে ট্যাগের বিষয়বস্তুগুলি পরীক্ষা করে এটি চালিয়ে যাবে।
  4. এটি পৌঁছানো অবধি পার্সিং অবিরত থাকবে a < , কোন পর্যায়ে এটি প্রকাশের শুরুতে পুনরাবৃত্তি করবে, এটি কোনও মন্তব্য বা একটি নতুন ট্যাগকে মোকাবেলা করার অনুমতি দেয়।
  5. এটি লুপের মধ্য দিয়ে অবিরত থাকবে যতক্ষণ না এটি পাঠ্যের শেষের দিকে আসে বা <এটি বিশ্লেষণ করতে পারে না। মেলাতে ব্যর্থতা অবশ্যই প্রক্রিয়াটি আবার শুরু করার কারণ করবে। অন্যথায়, <সম্ভবত এই পুনরাবৃত্তির জন্য ক্লোজিং ট্যাগের শুরু is একটি সমাপ্ত ট্যাগের অভ্যন্তরে পিছনে উল্লেখটি ব্যবহার করে <\/\1>এটি বর্তমান পুনরাবৃত্তির (গভীরতা) জন্য খোলার ট্যাগের সাথে মিলবে। এখানে কেবল একটি ক্যাপচারিং গ্রুপ রয়েছে, সুতরাং এই ম্যাচটি একটি সাধারণ বিষয়। এটি এটিকে ব্যবহৃত ট্যাগগুলির নাম থেকে স্বতন্ত্র করে তোলে, যদিও আপনার প্রয়োজন হলে কেবলমাত্র নির্দিষ্ট ট্যাগগুলি ক্যাপচারের জন্য আপনি ক্যাপচারিং গ্রুপটি সংশোধন করতে পারেন।
  6. এই মুহুর্তে এটি হয় বর্তমান পুনরাবৃত্তির বাইরে চলে যাবে, পরবর্তী স্তর পর্যন্ত বা একটি ম্যাচ দিয়ে শেষ হবে।

এই উদাহরণটি শ্বেত স্পেসের সাথে সম্পর্কিত সমস্যাগুলি সনাক্ত করে বা প্রাসঙ্গিক বিষয়বস্তু সনাক্ত করার জন্য সমস্যাগুলি সমাধান করে যা নিছক উপেক্ষা করে <বা >, অথবা মন্তব্যগুলির ক্ষেত্রে ব্যবহার করে [\S\s], যা ক্যারেজ রিটার্ন এবং নতুন লাইনের সাথে কোনও কিছুর সাথে মিলবে, এমনকি একক লাইনেও মোড, এটি পৌঁছানো অবধি অবিরত -->। অতএব, এটি অর্থবহ কিছুতে না পৌঁছা পর্যন্ত এটি কেবল সবকিছুকে বৈধ হিসাবে বিবেচনা করে।

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

দীর্ঘ গল্প সংক্ষিপ্ত: বাস্তব কাজের জন্য একটি এক্সএমএল পার্সার ব্যবহার করুন, এবং আপনি যদি রেইজেক্সগুলি নিয়ে খেলতে চান তবে এটি ব্যবহার করুন।


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

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

0

এক্সএএমএমএল / এইচটিএমএলকে রেজেজের সাথে পার্স করবেন না, একটি সঠিক এক্সএমএল / এইচটিএমএল পার্সার এবং শক্তিশালী ব্যবহার করুন প্রশ্ন.

তত্ত্ব:

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

রিয়েললাইফ ™ ® ™ দৈনিক সরঞ্জাম :

আপনি নিম্নলিখিতগুলির মধ্যে একটি ব্যবহার করতে পারেন:

xmllint প্রায়শই libxml2xpath1 এর সাহায্যে ডিফল্টরূপে ইনস্টল করা হয় ( নতুন রেখার সীমিত আউটপুট পেতে আমার মোড়ক পরীক্ষা করে

এক্সএমএল স্টারলেট সম্পাদনা করতে, নির্বাচন করতে, রূপান্তর করতে পারে ... ডিফল্টরূপে ইনস্টল করা হয় না, xpath1

পার্পের মডিউল XML :: XPath, xpath1 এর মাধ্যমে xpath ইনস্টল করা হয়েছে

xidel xpath3

স্যাকসন-লিন্ট আমার নিজস্ব প্রকল্প, @ মিশেল কেয়ের স্যাকসন-এইচ জাভা লাইব্রেরি, এক্সপ্যাথ 3

বা আপনি উচ্চ স্তরের ভাষা এবং যথাযথ libs ব্যবহার করতে পারেন, আমি মনে করি:

এর lxml( from lxml import etree)

'গুলি XML::LibXML, XML::XPath, XML::Twig::XPath,HTML::TreeBuilder::XPath

, এই উদাহরণটি পরীক্ষা করুন

DOMXpath, এই উদাহরণটি পরীক্ষা করুন


চেক করুন: এইচটিএমএল ট্যাগ সহ নিয়মিত এক্সপ্রেশন ব্যবহার করা

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