রেজেক্স - কীভাবে কোনও নির্দিষ্ট প্যাটার্ন বাদে সমস্ত কিছু মিলবে


171

কোনও নির্দিষ্ট প্যাটার্নের সাথে মেলে না এমন কোনও স্ট্রিংয়ের সাথে মেলে আমি কীভাবে একটি রেজেেক্স লিখব? আমি এমন পরিস্থিতির মুখোমুখি হয়েছি যেখানে আমাকে একটি (এ এবং ~ বি) প্যাটার্নটি মেলাতে হবে।


পিসিআরই এর জন্য সবচেয়ে ভাল হবে: দেখুন রেজেজেক্স প্যাটার্ন টু ম্যাচ, কখন বাদে / / এর মধ্যে বাদে । আমি findstrট্যাগটি সরিয়েছি কারণ এখানে সমস্ত উত্তর ট্যাগের জন্য বৈধ নয়।
উইক্টর স্ট্রিবিউউ

উত্তর:


192

আপনি চেহারা-এগিয়ে দৃ as়তা ব্যবহার করতে পারেন:

(?!999)\d{3}

এই উদাহরণটি ছাড়াও তিনটি সংখ্যার সাথে মেলে 999


তবে আপনি যদি এই বৈশিষ্ট্যটির সাথে নিয়মিত প্রকাশের প্রয়োগ না করান ( নিয়মিত এক্সপ্রেশন ফ্লেভারগুলির তুলনা দেখুন ), আপনার সম্ভবত বুনিয়াদি বৈশিষ্ট্যগুলি নিয়ে একটি নিয়মিত প্রকাশ করতে হবে।

শুধুমাত্র বেসিক সিনট্যাক্সের সাথে একটি সামঞ্জস্যপূর্ণ নিয়মিত প্রকাশটি হ'ল:

[0-8]\d\d|\d[0-8]\d|\d\d[0-8]

এটি কোনও তিন অঙ্কের ক্রমের সাথেও মেলে 999


1
চেহারা সামনের স্ট্যান্ডার্ড নিয়মিত প্রকাশের বাক্য গঠন নয়, এটি পার্ল এক্সটেনশান, এটি কেবল পার্ল, পিসিআরই (পার্ল-সামঞ্জস্যপূর্ণ রেজেক্স) বা অন্যান্য অ-মানক বাস্তবায়নে কাজ করবে
জুলিয়ানো

10
এটি স্ট্যান্ডার্ড নাও হতে পারে তবে বেশিরভাগ আধুনিক ভাষা কি এটি সমর্থন করে না? আজকাল কোন ভাষা চেহারা-এগিয়ে সমর্থন করে না ?
ব্রায়ান ওকলি

1
সেটা সত্য. তবে বেশিরভাগ রেজেক্সেক্স স্বাদগুলি এই বৈশিষ্ট্যটিকে সমর্থন করে (দেখুন << নিয়মিত-এক্সপ্রেসন.ইন.ফো / রিফ্লাভর্সHtml> )।
গম্বো

1
আমি মনে করি শেষ রেজেক্সটিও 009, 019 ... ইত্যাদির সাথে মেলে না
সেবাস্তিয়ান ভাইরেক

1
সি এর জন্য স্ট্যান্ডার্ড লেক্স পিসিআরই ব্যবহার করে না :-(
পাইমান 72

30

আপনি যদি একটি স্ট্রিং এ শব্দের সাথে শব্দের সাথে মিল রাখতে চান এবং একটি শব্দের সাথে বি না মিলেন For উদাহরণস্বরূপ: আপনার যদি একটি পাঠ্য থাকে:

1. I have a two pets - dog and a cat
2. I have a pet - dog

আপনি যদি কোনও পাঠ্য রেখার সন্ধান করতে চান যে কোনও পোষা প্রাণীর জন্য একটি কুকুর আছে এবং তার কাছে বিড়াল নেই, আপনি এই নিয়মিত প্রকাশটি ব্যবহার করতে পারেন:

^(?=.*?\bdog\b)((?!cat).)*$

এটি কেবল দ্বিতীয় লাইনের সন্ধান করবে:

2. I have a pet - dog

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

2
এইচএম, হ্যাঁ, পোস্টগুলিতে তার একটি মন্তব্যে আমি এখন খুঁজে পেয়েছি। আমি শিরোনামে রেগেক্সকে দেখেছি। যাইহোক, যদি আমি এই মত নিয়মিত অভিব্যক্তির জন্য একই সন্ধানের সময় যদি এই পোস্টটি খুঁজে পাই তবে এটি কারও পক্ষে সহায়ক হতে পারে :) মন্তব্যের জন্য ধন্যবাদ
আলেকস

15

প্যাটার্নের সাথে মিল করুন এবং ম্যাচের বুলিয়ান ফলাফলটি উল্টাতে হোস্ট ভাষাটি ব্যবহার করুন। এটি অনেক বেশি স্পষ্টত এবং রক্ষণাবেক্ষণযোগ্য হবে।


1
তারপরে আমি কেবল (A এবং ~ B) এর পরিবর্তে (~ A বা B) দিয়ে শেষ করব। এটি আমার সমস্যার সমাধান করে না।
21

1
সিউডো-কোড: স্ট্রিং টু টেস্ট; যদি (ToTest.matches (A) এবং! toTest.matches (B)) {...}
বেন এস

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

8

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

আমি এমন পরিস্থিতির মুখোমুখি হয়েছি যেখানে আমাকে একটি (এ এবং ~ বি) প্যাটার্নটি মেলাতে হবে।

এর জন্য প্রাথমিক রেজেক্সটি ভীতিজনকভাবে সহজ: B|(A)

আপনি কেবল সামগ্রিক ম্যাচগুলিকে উপেক্ষা করুন এবং গ্রুপ 1 ক্যাপচারগুলি পরীক্ষা করুন, এতে A থাকবে A.

একটি উদাহরণ (রেজেক্সে এইচটিএমএল পার্স করা সম্পর্কিত সমস্ত দাবি অস্বীকার সহ): এ হচ্ছে অঙ্কগুলি, বি এর মধ্যে অঙ্কগুলি <a tag

রেজেক্স: <a.*?<\/a>|(\d+)

ডেমো (নীচের ডান প্যানেলে গ্রুপ 1 দেখুন)

উল্লেখ

পরিস্থিতি s1, s2, s3 ব্যতীত কীভাবে প্যাটার্নটি মেলে যায়

প্যাটার্নটি কীভাবে মেলে ...


এটি সত্য বলে মনে হচ্ছে খুব ভাল! দুর্ভাগ্যবশত, এই সমাধান সার্বজনীন নয় এবং এটা এ গিয়ে Emacs মধ্যে ব্যর্থ হয়, প্রতিস্থাপন পরেও \dসঙ্গে [[:digit:]]প্রথম রেফারেন্সটিতে এটি পার্ল এবং পিএইচপি-র সাথে নির্দিষ্ট উল্লেখ করা হয়েছে: "পার্ল এবং পিএইচপি-তে নির্দিষ্ট সিনট্যাক্স ব্যবহার করে একটি ভিন্নতা পাওয়া যায় যা এটি সম্পাদন করে।"
মাইগুয়েলমোরিন

4

একটি নিয়মিত ভাষার পরিপূরক এছাড়াও একটি নিয়মিত ভাষা, তবে এটি তৈরি করতে আপনাকে নিয়মিত ভাষার জন্য ডিএফএ তৈরি করতে হবে, এবং কোনও বৈধ রাষ্ট্র পরিবর্তনকে একটি ত্রুটিতে পরিণত করতে হবে। দেখুন এই একটি উদাহরণ জন্য। কোন পৃষ্ঠাটি বলে না এটি রূপান্তরিত হয় /(ac|bd)/মধ্যে /(a[^c]?|b[^d]?|[^ab])/। ডিএফএ থেকে নিয়মিত অভিব্যক্তিতে রূপান্তর তুচ্ছ নয়। যদি আপনি নিয়মিত অভিব্যক্তি অপরিবর্তিতভাবে ব্যবহার করতে পারেন এবং কোডটির শব্দার্থবিজ্ঞান পরিবর্তন করতে পারেন, যেমন পূর্বে প্রস্তাবিত।


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

উপরে বর্ণিত লুকোহেড এটি করেছে, যদি ফাইন্ডস্টার সত্যিকারের ডিএফএ রেজেক্সগুলির বাইরে কিছু করে থাকে। পুরো জিনিসটি এক ধরণের অদ্ভুত এবং আমি জানি না কেন আমাকে এই কমান্ড-লাইন (এখন ব্যাচ) স্টাইলটি করতে হবে। এটি আমার হাত বাঁধা অন্য উদাহরণ another
notnot

1
@ নোট: আপনি উইন্ডোজ থেকে Findstr ব্যবহার করছেন? তারপরে আপনার কেবল দরকার / ভি। পছন্দ: findstr একটি ইনপুট ফাইল | সন্ধান </ b> আউটপুটফিল.টিএক্সটি প্রথম ক এর সাথে সমস্ত রেখার সাথে মেলে, দ্বিতীয়টি সমস্ত লাইনের সাথে মেলে যা বি নেই
জুলিয়ানো

ধন্যবাদ! এটাই আসলে আমার যা প্রয়োজন ছিল। যদিও আমি সেভাবে প্রশ্নটি করি নি, তাই আমি আরও সাধারণতর উত্তরের জন্য গম্বোর উত্তর দিই।
notnot

1

প্যাটার্ন - পুনরায়

str.split(/re/g) 

প্যাটার্ন বাদে সবকিছু ফিরিয়ে দেবে।

পরীক্ষা এখানে


আপনি সম্ভবত উল্লেখ করতে চান যে আপনাকে আবার যোগদান করতে হবে।
টমডেমুয়েট

একটি অনুরূপ পদ্ধতির ব্যবহার করা হচ্ছে replace str.replace(/re/g, ''), তারপরে তাদের সাথে পুনরায় যোগদানের দরকার নেই। এছাড়াও যদি আপনি একটি সুন্দর পেছনে ফেলে দেন? এর মতো str.replace(/\re\s?/g, '')আপনি কোনও ডুপ্লিকেট স্পেসগুলি থেকে মুক্তি পেয়ে যাতে কোনও স্ট্রিংয়ের মাঝামাঝি কিছু প্রতিস্থাপন হতে পারে
জ্যাকক্রাইজে

0

আমার উত্তর এখানে আপনার সমস্যাটিও সমাধান করতে পারে:

https://stackoverflow.com/a/27967674/543814

  • প্রতিস্থাপনের পরিবর্তে, আপনি ম্যাচটি ব্যবহার করবেন।
  • দলের পরিবর্তে $1, আপনি গ্রুপ পড়তে হবে $2
  • গ্রুপ $2অ ক্যাপচার প্রণীত সেখানে, যা আপনি এড়িয়ে চলতে হবে।

উদাহরণ:

Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");

প্রথম ক্যাপচারিং গ্রুপটি যে প্যাটার্নটি আপনি এড়াতে চান তা নির্দিষ্ট করে। সর্বশেষ ক্যাপচারিং গ্রুপ অন্য সমস্ত কিছু ক্যাপচার করে। কেবল এই গ্রুপটি পড়ুন $2,।


0
(B)|(A)

তারপরে কী গ্রুপ 2 ক্যাপচার করেছে তা ব্যবহার করুন ...


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