তাদের শক্তি হারানো ছাড়া নিয়মিত প্রকাশযোগ্য পাঠযোগ্য?


77

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

একটি সাধারণ কেস ফলাফলের জন্য জাভা রিজেক্সপ হিসাবে এটির মতো কিছু হতে পারে:

Pattern re = Pattern.compile(
  "^\\s*(?:(?:([\\d]+)\\s*:\\s*)?(?:([\\d]+)\\s*:\\s*))?([\\d]+)(?:\\s*[.,]\\s*([0-9]+))?\\s*$"
);

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

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

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


এবং তারপরে, পূর্বের রিজেপেক্স যা করে তা হ'ল: বিন্যাসে একটি সংখ্যার একটি স্ট্রিংকে পার্স করুন 1:2:3.4, প্রতিটি সংখ্যা ক্যাপচার করুন, যেখানে ফাঁকা স্থান অনুমোদিত এবং কেবলমাত্র 3প্রয়োজনীয়।


2
এসও সম্পর্কিত বিষয়: stackoverflow.com/a/143636/674039
উইম

24
রিজেক্সগুলি পড়া / সম্পাদনা করা আসলে তুচ্ছ, যদি আপনি জানেন যে তাদের কী ক্যাপচার করার কথা। আপনি সম্ভবত বেশিরভাগ ভাষার "কমেন্টস" নামক ভাষার ব্যবহারযোগ্য বৈশিষ্ট্যটি শুনেছেন। আপনি যদি কোনও জটিল রেজেক্সের উপরে কিছু না রাখেন তবে এটি কী করে তা ব্যাখ্যা করে আপনি পরে দামটি প্রদান করবেন। এছাড়াও, কোড পর্যালোচনা।
টিসি 1

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

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

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

উত্তর:


80

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

string number = "(\\d+)";
string unit = "(?:" + number + "\\s*:\\s*)";
string optionalDecimal = "(?:\\s*[.,]\\s*" + number + ")?";

Pattern re = Pattern.compile(
  "^\\s*(?:" + unit + "?" + unit + ")?" + number + optionalDecimal + "\\s*$"
);

সর্বাধিক পঠনযোগ্য নয়, তবে আমি মনে করি এটি আসলটির চেয়ে পরিষ্কার।

এছাড়াও, সি # এর @অপারেটর রয়েছে যা এটি অক্ষরে অক্ষরে নেওয়া উচিত তা নির্দেশ করার জন্য একটি স্ট্রিংতে প্রেন্ডেন্ট করা যেতে পারে (কোনও পালানোর অক্ষর নেই), তাই numberহবে@"([\d]+)";


এখনই খেয়াল কিভাবে উভয় [\\d]+এবং [0-9]+মাত্র হওয়া উচিত \\d+(অবশ্য কিছু খুঁজে পেতে পারেন [0-9]+আরো পাঠযোগ্য)। আমি প্রশ্নটি সম্পাদনা করতে যাচ্ছি না, তবে আপনি এই উত্তরটি ঠিক করতে চাইতে পারেন।
হাইড

@ হাইড - ভাল ক্যাচ প্রযুক্তিগতভাবে তারা একেবারে একই জিনিস নয় - \dএমন কোনও সংখ্যার সাথে মিলবে যা একটি সংখ্যা হিসাবে বিবেচিত হবে, এমনকি অন্যান্য সংখ্যা পদ্ধতিতে (চাইনিজ, আরবি ইত্যাদি), যখন [0-9]কেবল মানক সংখ্যার সাথে মিলবে will \\dযদিও আমি এটি মানক করেছিলাম , এবং এটি optionalDecimalপ্যাটার্নে ফ্যাক্টর করি ।
ববসন

42

নিয়মিত অভিব্যক্তি ডকুমেন্ট করার মূল চাবিকাঠি এটি ডকুমেন্ট করে। খুব সম্ভবত প্রায়শই লোকেরা যা শব্দকণ্ঠ বলে মনে হয় তা টস করে এবং এটিকে রেখে দেয়।

মধ্যে Perl/x রেগুলার এক্সপ্রেশন শেষে অপারেটর রেগুলার এক্সপ্রেশন দস্তাবেজ হিসেবে রাখার জন্য এক, যার ফলে হোয়াইটস্পেস শুষে নেবে।

উপরের নিয়মিত প্রকাশটি তখন হয়ে যাবে:

$re = qr/
  ^\s*
  (?:
    (?:       
      ([\d]+)\s*:\s*
    )?
    (?:
      ([\d]+)\s*:\s*
    )
  )?
  ([\d]+)
  (?:
    \s*[.,]\s*([\d]+)
  )?
  \s*$
/x;

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

এবং তারপরে, পূর্ববর্তী রিজেক্সেফ যা করে তা হ'ল: 1: 2: 3.4 ফরম্যাটে সংখ্যার একটি স্ট্রিংকে পার্স করুন, প্রতিটি সংখ্যা ক্যাপচার করুন, যেখানে ফাঁকা স্থান অনুমোদিত এবং কেবলমাত্র 3 টি প্রয়োজনীয়।

এই নিয়মিত অভিব্যক্তিটি দেখে কেউ দেখতে পায় যে এটি কীভাবে কাজ করে (এবং কাজ করে না)। এই ক্ষেত্রে, এই রেজেক্স স্ট্রিংটির সাথে মিলবে 1

অন্যান্য ভাষায় অনুরূপ পন্থা নেওয়া যেতে পারে। পাইথন রি.ভার্বোস অপশনটি সেখানে কাজ করে।

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

জাভাতে (যেখানে এই উদাহরণটি এঁকেছে), কেউ রেজেক্স গঠনের জন্য স্ট্রিং কনটেনটেশন ব্যবহার করতে পারেন।

Pattern re = Pattern.compile(
  "^\\s*"+
  "(?:"+
    "(?:"+
      "([\\d]+)\\s*:\\s*"+  // Capture group #1
    ")?"+
    "(?:"+
      "([\\d]+)\\s*:\\s*"+  // Capture group #2
    ")"+
  ")?"+ // First groups match 0 or 1 times
  "([\\d]+)"+ // Capture group #3
  "(?:\\s*[.,]\\s*([0-9]+))?"+ // Capture group #4 (0 or 1 times)
  "\\s*$"
);

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

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


13
"ডকুমেন্টিং" এবং "লাইন ব্রেকগুলি যুক্ত করার" মধ্যে একটি বড় পার্থক্য রয়েছে।

4
@ জোনফএলট্রেডস কোডটি পড়তে সক্ষম করা কোনও কিছুর প্রথম ধাপ। লাইন ব্রেকগুলি যুক্ত করাও একই লাইনে আরई-র সাবসেটের জন্য মন্তব্য যুক্ত করার অনুমতি দেয় (নিয়মিত প্রকাশের পাঠ্যের একক দীর্ঘ লাইনে এটি করা আরও কঠিন)।

2
@ জোনফএল ট্রেডস, আমি বেশ দৃ strongly়তার সাথে একমত নই। "ডকুমেন্টিং" এবং "অ্যাডিং লাইন ব্রেক" এর চেয়ে আলাদা নয় যে তারা উভয়ই একই উদ্দেশ্যে পরিবেশন করে - কোডটি বোঝা সহজ করে তোলে। এবং খারাপ-ফর্ম্যাটেড কোডের জন্য, "লাইন ব্রেকগুলি যুক্ত করা" ডকুমেন্টেশন যুক্ত করার চেয়ে সেই উদ্দেশ্যটি আরও ভালভাবে সরবরাহ করে।
বেন লি

2
লাইন ব্রেক যোগ করা একটি শুরু, তবে এটি কাজের প্রায় 10%। অন্যান্য উত্তরগুলি আরও নির্দিষ্ট করে, যা সহায়ক।

26

কিছু ভাষা এবং গ্রন্থাগারগুলির দ্বারা প্রদত্ত "ভার্বোস" মোড এই উদ্বেগগুলির অন্যতম উত্তর। এই মোডে, regexp স্ট্রিংয়ের সাদা স্থানটি ছিটানো হয় (যাতে আপনার ব্যবহারের প্রয়োজন \s) এবং মন্তব্যগুলি সম্ভব। পাইথনের একটি ছোট উদাহরণ এখানে ডিফল্টরূপে এটি সমর্থন করে:

email_regex = re.compile(r"""
    ([\w\.\+]+) # username (captured)
    @
    \w+         # minimal viable domain part
    (?:\.w+)    # rest of the domain, after first dot
""", re.VERBOSE)

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


15

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

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


1
উত্তরের শুরুতে উল্লিখিত "সরল ব্লকগুলি" দ্বারা, আপনি কি কেবল স্ট্রিং কনটেন্টেশন বা আরও উন্নত কিছু বোঝাতে চাইছেন?
হাইড

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

11

আমি এক্সপ্রেসো: http://www.ultrapico.com/Expresso.htm ব্যবহার করতে চাই

এই নিখরচায় অ্যাপ্লিকেশনটিতে নিম্নলিখিত বৈশিষ্ট্য রয়েছে যা আমি সময়ের সাথে দরকারী:

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

উদাহরণস্বরূপ, আপনি সবেমাত্র জমা দিয়েছিলেন রেগেক্সের সাথে, এটি দেখতে দেখতে এমন হবে: প্রাথমিকভাবে প্রদত্ত রেগেক্স সহ নমুনা পর্দা

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


4
আপনি আরও বিস্তারিতভাবে এ সম্পর্কে ব্যাখ্যা করতে মন চান - এটি কীভাবে এবং কেন জিজ্ঞাসা করা প্রশ্নের উত্তর দেয়? "লিঙ্ক কেবল-উত্তর" স্ট্যাক এক্সচেঞ্জ বেশ স্বাগত জানাই হয় না
মশা

5
@gnat দুঃখিত যে সম্পর্কে। আপনি একদম ঠিক বলছেন. আমি আশা করি যে আমার সম্পাদিত উত্তরটি আরও অন্তর্দৃষ্টি দেয়।
ই। জয়প

9

কিছু কিছুর জন্য, এটি কেবল বিএনএফের মতো ব্যাকরণ ব্যবহার করতে সহায়তা করতে পারে। এগুলি নিয়মিত প্রকাশের চেয়ে পড়া সহজ হতে পারে be গোল্ড পার্সার বিল্ডারের মতো একটি সরঞ্জাম ব্যাকরণটিকে পার্সারে রূপান্তর করতে পারে যা আপনার জন্য ভারী উত্তোলন করে।

বিএনএফ, ইবিএনএফ ইত্যাদি ব্যাকরণ একটি জটিল নিয়মিত অভিব্যক্তির চেয়ে পড়া এবং তৈরি করা অনেক সহজ হতে পারে। গোল্ড এই জাতীয় জিনিসগুলির জন্য একটি সরঞ্জাম।

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

নিয়মিত এক্সপ্রেশন বিকল্প

"বিভিন্ন সিনট্যাক্সের সাথে শব্দার্থগত সমতুল্য সুবিধা" বোঝাতে "বিকল্প" নিলে নিয়মিত এক্সপ্রেসনের সাথে / কমপক্ষে এই বিকল্পগুলি রয়েছে:

  • বেসিক নিয়মিত প্রকাশ
  • "বর্ধিত" নিয়মিত অভিব্যক্তি
  • পার্ল-সামঞ্জস্যপূর্ণ নিয়মিত অভিব্যক্তি
  • ... এবং অন্যান্য বিভিন্ন রূপ ...
  • SNOBOL- শৈলী আরই সিনট্যাক্স (স্নোবোল্যাঙ্গেজ, আইকন ভাষা)
  • এসআরই সিনট্যাক্স (এসইএসএক্সপ্রেসানস হিসাবে আর ই)
  • বিভিন্ন এফএসএম সিনটাসেস
  • সীমাবদ্ধ রাষ্ট্র ছেদ ব্যাকরণ (বেশ অভিব্যক্তিপূর্ণ)
  • ওমেটাল্যাঙ্গোয়েজ এবং লুআল্যাংগুয়েজে যেমন ( http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html ) পার্সিংএক্সগ্রেশনগ্র্যামারস
  • RebolLanguage এর পার্স মোড
  • ProbabilityBasedParsing ...

এই লিঙ্কটি কী করে এবং এটি কী জন্য ভাল তা সম্পর্কে আরও ব্যাখ্যা করতে আপনি কি আপত্তি করবেন? "লিঙ্ক কেবল-উত্তর" স্ট্যাক এক্সচেঞ্জ বেশ স্বাগত জানাই হয় না
মশা

1
প্রোগ্রামারগুলিতে স্বাগতম, নিক পি। দয়া করে ডাউনটোট / র উপেক্ষা করুন, তবে মেটাতে যে পৃষ্ঠাটি পড়েছেন তা পড়ুন না gn
ক্রিস্টোফার লেট

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

6

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

// Create an example of how to test for correctly formed URLs
var tester = VerEx()
    .startOfLine()
    .then('http')
    .maybe('s')
    .then('://')
    .maybe('www.')
    .anythingBut(' ')
    .endOfLine();

// Create an example URL
var testMe = 'https://www.google.com';

// Use RegExp object's native test() function
if (tester.test(testMe)) {
    alert('We have a correct URL '); // This output will fire}
} else {
    alert('The URL is incorrect');
}

console.log(tester); // Outputs the actual expression used: /^(http)(s)?(\:\/\/)(www\.)?([^\ ]*)$/

এই উদাহরণটি জাভাস্ক্রিপ্টের জন্য, আপনি এখন অনেকগুলি প্রোগ্রামিং ভাষার জন্য এই লাইব্রেরিটি খুঁজে পেতে পারেন


2
এটা সত্যিই দারুন!
জেরেমি থম্পসন

3

সবচেয়ে সহজ উপায় হ'ল রেজেেক্স ব্যবহার করা কিন্তু বর্ণনামূলক নামগুলির সাথে সহজ এক্সপ্রেশন রচনা থেকে আপনার অভিব্যক্তি তৈরি করা যেমন http://www.martinfowler.com/bliki/CompusedRegex.html (এবং হ্যাঁ এটি স্ট্রিং কনট্যাক্ট থেকে এসেছে)

তবে বিকল্প হিসাবে আপনি পার্সার কম্বিনেটর লাইব্রেরি যেমন http://jparsec.codehaus.org/ ব্যবহার করতে পারেন যা আপনাকে একটি পূর্ণ পুনরাবৃত্ত শালীন পার্সার দেবে। আবার এখানে আসল শক্তি আসে কম্পোজিশন (এবার কার্যকরী রচনা) থেকে।


3

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

গ্রুকের মধ্যে প্রকাশিত উপরের প্যাটার্নটি হ'ল (আমি ডিবাগার অ্যাপে পরীক্ষা করেছি তবে ব্লুন্ডার হতে পারে):

"(( *%{NUMBER:a} *:)? *%{NUMBER:b} *:)? *%{NUMBER:c} *(. *%{NUMBER:d} *)?"

Partsচ্ছিক অংশ এবং স্পেসগুলি এটিকে স্বাভাবিকের চেয়ে খানিকটা খারাপ মনে হয় তবে এখানে এবং অন্যান্য ক্ষেত্রে উভয়ই খাঁচা ব্যবহার করা ব্যক্তির জীবনকে আরও সুন্দর করে তুলতে পারে।


2

F # এ আপনার FsVerbalExpressions মডিউল রয়েছে। এটি আপনাকে মৌখিক অভিব্যক্তিগুলি থেকে রেজিক্সগুলি রচনা করতে দেয়, এতে কিছু প্রাক-বিল্ট রেইজেক্সও রয়েছে (যেমন ইউআরএল)।

এই বাক্য গঠনটির উদাহরণগুলির মধ্যে একটি নিম্নরূপ:

let groupName =  "GroupNumber"

VerbEx()
|> add "COD"
|> beginCaptureNamed groupName
|> any "0-9"
|> repeatPrevious 3
|> endCapture
|> then' "END"
|> capture "COD123END" groupName
|> printfn "%s"

// 123

আপনি যদি এফ # সিনট্যাক্সের সাথে পরিচিত না হন, গ্রুপনেম হ'ল "গ্রুপ নাম্বার" string

তারপরে তারা একটি ভারবাল এক্সপ্রেশন (VerbEx) তৈরি করে যা তারা "সিওডি (? <গোষ্ঠী সংখ্যা> [0-9] {3}) সমাপ্তি" হিসাবে তৈরি করে। যা তারা তারপরে "COD123END" স্ট্রিংটিতে পরীক্ষা করে, যেখানে তারা নামকৃত ক্যাপচার গ্রুপ "GroupNumber" পায় get 123 এ ফলাফল।

আমি সত্যই বুঝতে পারি যে সাধারণ রেজেক্সকে বোঝা অনেক সহজ।


-2

প্রথমত, যে কোডটি কেবলমাত্র কাজ করে তা খারাপ কোড understand গুড কোডে যে কোনও ত্রুটি ঘটেছিল তার সঠিকভাবে রিপোর্ট করাও দরকার।

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

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

"খারাপ কোড যা নিছক কাজ করে" কে "ভাল কোড যা যথেষ্ট পরিমাণে বর্ণনামূলক ত্রুটি সরবরাহ করে" তে রূপান্তরিত করতে আপনাকে রেজেক্সকে অনেকগুলি ছোট ছোট রেজেক্সে বিভক্ত করতে হবে (সাধারণত, রেজেক্সস এত ছোট যে প্রথম স্থানে রেজেক্স ছাড়া এটি করা সহজ easier )।

কোডটি পঠনযোগ্য / বজায় রাখতে সক্ষম করা কোডটি ভাল করার এক দুর্ঘটনাজনক পরিণতি।


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

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

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

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

এছাড়াও, কল্পনা করুন যে অর্ধ প্রশিক্ষিত সহায়তা ডেস্ক অপারেটর পুরোপুরি প্রশিক্ষণপ্রাপ্ত ব্যবহারকারীর কাছ থেকে বাগ রিপোর্ট পেয়েছে যা বলেছে: সফ্টওয়্যার কাজ করা বন্ধ করে দিয়েছে - সফ্টওয়্যারটির লগের শেষ লাইনটি "ত্রুটি: সংস্করণ স্ট্রিং 'থেকে ছোটখাটো সংস্করণ নম্বর বের করতে ব্যর্থ হয়েছে: 1: 2-3.4 '(দ্বিতীয় সংখ্যার পরে প্রত্যাশিত কোলন) "
ব্রেন্ডন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.