আপনি যখন নিয়মিত এক্সপ্রেশন ব্যবহার করবেন না? [বন্ধ]


50

নিয়মিত প্রকাশগুলি প্রোগ্রামারের অস্ত্রাগারগুলির শক্তিশালী হাতিয়ার, তবে - কিছু ক্ষেত্রে রয়েছে যখন তারা সেরা পছন্দ না হয় বা এমনকি সম্পূর্ণ ক্ষতিকারক হয় না।

সহজ উদাহরণ # 1 হ'ল এইচটিএমএলকে রেজিপ এক্স দিয়ে পার্স করা - এটি অসংখ্য বাগের পরিচিত রাস্তা। সম্ভবত, এটি সাধারণভাবে পার্সিংকেও দায়ী করে ।

তবে, নিয়মিত অভিব্যক্তির জন্য কি আরও পরিষ্কারভাবে কোনও গো-অঞ্চল রয়েছে?


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


9
রিজএক্সপ্যাকের সাথে এইচটিএমএলকে পার্সিং করা কেবল "অসংখ্য বাগের একটি পরিচিত রাস্তা" নয়। এটা আসলে অসম্ভব
ক্রামেই পুনরায় ইনস্টল করুন মনিকা


3
@ জার্গ: রেগএক্সপ্যাক্স নিয়মিত প্রকাশের জন্য কেবল একটি সংক্ষেপণ।
জোরেেন

3
@ জার্গ: এটি খুব সত্য যে গণিতের নিয়মিত প্রকাশ এবং সফ্টওয়্যার লাইব্রেরিতে তাদের প্রয়োগের মধ্যে প্রচুর পার্থক্য রয়েছে। এটিও সত্য যে বেশিরভাগ নিয়মিত এক্সপ্রেশন লাইব্রেরিতে এক্সটেনশান থাকে যা এগুলিকে কেবল নিয়মিত ভাষা গ্রহণের বাইরে রাখে এবং তাদের নিয়মিত এক্সপ্রেশন বলা সর্বদা যথাযথ নয় is আমি আপনার সাথে একমত যে দুটি ভিন্ন ধারণা আছে। তবে তাদের একই নাম রয়েছে; regexp এখনও একটি সংক্ষিপ্তসার, নিজের মধ্যে একটি শব্দ নয়। সফ্টওয়্যার গ্রন্থাগারগুলির জন্য পুরো শব্দটি ব্যবহার করার জন্য এই সাইটে প্রচুর উদাহরণ examples
জোরেেন

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

উত্তর:


60

নিয়মিত এক্সপ্রেশন ব্যবহার করবেন না:

  • যখন পার্সার থাকে।

এটি এইচটিএমএলে সীমাবদ্ধ করে না । একটি সাধারণ বৈধ এক্সএমএলকে নিয়মিত এক্সপ্রেশন দিয়ে যুক্তিসঙ্গতভাবে পার্স করা যায় না, এমনকি আপনি যদি স্কিমাটি জানেন এবং আপনি জানেন তবে এটি কখনই পরিবর্তিত হবে না।

উদাহরণস্বরূপ, সি # উত্স কোডটি পার্স করার চেষ্টা করবেন না । পরিবর্তে অর্থবহ গাছের কাঠামো বা টোকেন পেতে এটি পার্স করুন।

  • আরও সাধারণভাবে, যখন আপনার কাজ করার জন্য আরও ভাল সরঞ্জাম থাকে।

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

উদাহরণস্বরূপ ইনোগোর উত্তরের নমুনা কোডটি একটি ভাল উদাহরণ যখন আপনি নিয়মিত এক্সপ্রেশন ব্যবহার করবেন না। শুধু অনুসন্ধান foo, তারপর জন্য bar

  • মানব লেখার যখন বিশ্লেষণ।

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

  • কিছু ধরণের ডেটা বৈধকরণের সময়।

উদাহরণস্বরূপ, একটি নিয়মিত প্রকাশের মাধ্যমে কোনও ইমেল ঠিকানাটি বৈধ করবেন না। বেশিরভাগ ক্ষেত্রে, আপনি এটি ভুল করবেন। বিরল ক্ষেত্রে, আপনি এটি সঠিকভাবে করবেন এবং একটি 343 অক্ষরের দৈর্ঘ্যের কোডিং হরর দিয়ে শেষ করুন

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

  • আপনার কোডটি কখন পড়বে। এবং তারপরে আবার এবং বারবার, বিভিন্ন বিকাশকারী দ্বারা প্রতিবার পড়ুন।

গম্ভীরভাবে, আমি যদি আপনার কোডটি গ্রহণ করি এবং অবশ্যই এটি পর্যালোচনা করতে বা এটি সংশোধন করতে চাই, আমি বিশ লাইনের দীর্ঘ স্ট্রিং প্রচুর চিহ্ন বুঝতে চেষ্টা করে এক সপ্তাহ কাটাতে চাই না।


9
"সিরিয়াসলি, যদি আমি আপনার কোডটি নিই এবং অবশ্যই এটি পর্যালোচনা করতে বা এটি সংশোধন করতে চাই, আমি বিশ লাইনের দীর্ঘ স্ট্রিং প্রচুর চিহ্ন বুঝতে চেষ্টা করে এক সপ্তাহও কাটাতে চাই না" " +1 টি!
ফানকিব্রো

1
স্ট্যাক ওভারফ্লোতে এটির সৎ বোনের চেয়ে এটি আরও ভাল উত্তর: স্ট্যাকওভারফ্লো.com
কোবি

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

2
কালো তালিকাভুক্ত শব্দের বিশ্লেষণের জন্য নিয়মিত এক্সপ্রেশন ব্যবহার করা একটি ক্লাবুটিক ত্রুটি।
ড্যান রে

স্ট্রিংয়ের মতো একটি রেজেেক্স নিক্ষেপ করার কোনও কারণ পৃথিবীতে নেই "<a href='foo'>stuff</a>"। আধুনিক রেজেক্সগুলির এ নিয়ে কোনও সমস্যা নেই।
tchrist

18

সর্বাধিক গুরুত্বপূর্ণ বিষয়: আপনি যে ভাষাটি পার্স করছেন তা কোনও নিয়মিত ভাষা নয়

এইচটিএমএল হয় না নিয়মিত ভাষা ও একটি রেগুলার এক্সপ্রেশন সঙ্গে এটি পার্স হয় না সম্ভব (না শুধুমাত্র কঠিন বা বগী কোডে একটি রাস্তা)।


4
ভুল! আপনি যদি কোনও আধুনিক রেজেক্স স্বাদ ব্যবহার করে থাকেন (পার্ল, পিসিআরই, জাভা,। নেট, ...) আপনি পুনরাবৃত্তি এবং প্রতিবেদন করতে পারেন এবং এইভাবে পার্স করতে পারেন প্রসঙ্গ-মুক্ত এবং প্রসঙ্গ-সংবেদনশীল ব্যাকরণগুলির সাথেও match
নিকিসি

9
@NikiC। ভুল নয়। "আধুনিক রেজেক্স স্বাদ" নিয়মিত প্রকাশ নয় (যা নিয়মিত ভাষাগুলি বিশ্লেষণ করতে ব্যবহৃত হতে পারে, তাই এটি নাম)। আমি সম্মত হই যে পিআরই এর সাথে আপনি আরও কিছু করতে পারেন তবে আমি তাদের কেবল "নিয়মিত প্রকাশ" (মূল প্রশ্নের মতো) বলব না।
ম্যাটিও

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

12

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

উদাহরণ:

# bad
if (/complicated regex that assures the string does NOT conatin foo|bar/) {
    # do something
}

# appropriate
if (/foo|bar/) {
    # error handling
} else {
    # do something
}

1
+1: কয়েকবার, আমি নিজেকে থামিয়ে এবং নিজেকে জিজ্ঞাসা করে "ঠিক আছে, আমি বিশেষত কোনটি মেলানোর চেষ্টা করছি?" "আমি কী এড়াতে চাই?"

5

দুটি মামলা:

যখন একটি সহজ উপায় আছে

  • একটি স্ট্রিং অন্যটির উপসেট কিনা তা নির্ধারণ করতে বেশিরভাগ ভাষা INSTR এর মতো একটি সাধারণ ফাংশন সরবরাহ করে। যদি আপনি এটি করতে চান তবে সহজ ফাংশনটি ব্যবহার করুন। নিজের নিয়মিত ভাব প্রকাশ করবেন না।

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

যখন নিয়মিত প্রকাশগুলি যথেষ্ট শক্তিশালী হয় না

  • আপনার যদি পার্সার দরকার হয় তবে পার্সার ব্যবহার করুন।

0

নিয়মিত প্রকাশগুলি পুনরাবৃত্ত কাঠামো সনাক্ত করতে পারে না । এটি মৌলিক সীমাবদ্ধতা।

জেএসএন নিন - এটি একটি দুর্দান্ত সরল বিন্যাস, তবে যেহেতু কোনও বস্তুতে সদস্যের মানগুলি (নির্বিচারে গভীর) হিসাবে অন্যান্য বস্তু থাকতে পারে, তাই বাক্য গঠনটি পুনরাবৃত্ত হয় এবং একটি রেজেক্স দ্বারা পার্স করা যায় না। অন্যদিকে যে CSV উপর পারবেন regex'es দ্বারা বিশ্লেষণ হতে যেহেতু এটি কোনো রিকার্সিভ কাঠামো ধারণ করে না।

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

নোট করুন অন্যভাবে ফর্ম্যাটটি কীভাবে জটিল বা সংশ্লেষিত হয়েছে তার সাথে এর কোনও সম্পর্ক নেই। এস-এক্সপ্রেশনগুলি সত্যই সহজ, তবে একটি রেজেক্স দিয়ে পার্স করা যায় না। অন্যদিকে CSS 2 একটি প্রশংসনীয় জটিল ভাষা, কিন্তু রিকার্সিভ কাঠামো ধারণ করে না এবং তজ্জন্য করতে একটি Regex সঙ্গে বিশ্লেষণ হতে। (যদিও এটি CSS3 এর জন্য সিএসএস এক্সপ্রেশনগুলির কারণে সত্য নয়, যার পুনরাবৃত্তির বাক্য গঠন রয়েছে))

সুতরাং এটি কেবল কুশলী বা জটিল বা শুধুমাত্র রেজিএক্স ব্যবহার করে এইচটিএমএল পার্স করার জন্য ত্রুটি-ঝুঁকির কারণ নয়। এটা সহজভাবে সম্ভব হয় না যে ।

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

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

সুতরাং আপনি যখন শুনেন যে এইচটিএমএল বা সি # নিয়মিত প্রকাশের মাধ্যমে পার্স করা যায় না, সচেতন হন যে নিয়মিত প্রকাশগুলি এখনও পার্সারগুলির একটি গুরুত্বপূর্ণ অঙ্গ part আপনি কেবলমাত্র নিয়মিত এক্সপ্রেশন এবং কোনও সহায়ক কোড ব্যবহার করে এই জাতীয় ভাষাকে পার্স করতে পারবেন না ।

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