নিয়মিত এক্সপ্রেশন: কোনও অ্যান্ড অপারেটর আছে?


706

স্পষ্টতই, আপনি প্রতিনিধিত্ব করতে |(পাইপ?) ব্যবহার করতে পারেন OR, তবে ANDপাশাপাশি উপস্থাপন করার কোনও উপায় আছে কি?

বিশেষত, আমি পাঠ্যের অনুচ্ছেদের সাথে মিল রাখতে চাই যাতে নির্দিষ্ট বাক্যাংশের সমস্ত থাকে তবে কোনও নির্দিষ্ট ক্রমে নয়।


1
আপনি কি বোঝাতে চাইছেন যে আপনি কোনও পাঠ্যে বাক্যাংশ সন্ধান করতে চান, যেখানে এই জাতীয় প্রতিটি বাক্যাংশ একটি প্রদত্ত বাক্যাংশে শব্দের বৈধ অনুমান?
নিটেচে-জৌ

2
আমি এটি এখানে রাখছি কারণ তিন বা চারটি উত্তর এড়িয়ে চলে। লকহেহেড প্রতিটি ধারাটির জন্য একই দৈর্ঘ্যের সাথে মেলে না, যদি না এগুলি $ এ শেষ হয় $ একটি বর্ণবাদীর সাথে চারটি অক্ষর এবং অন্য 6 টি মিলতে পারে For উদাহরণস্বরূপ, (? = A *) (? = Aab) আবাবা ম্যাচ করবে
জাচারি ভ্যানস

2
"এবং" অপারেটরের জন্য "স্থান" অক্ষরটি ব্যবহার করে দেখুন।

I'd like to match paragraphs of text। ২.আউট -অফ-অর্ডার পাঠ্য থাকা। 1 নম্বর ব্যাখ্যার জন্য উন্মুক্ত। নম্বর 2 বেশ কয়েকটি উপায়ে করা যেতে পারে। ওয়ে 1 (?:(?:(?(1)(?!))\b(phrase1)\b.*?|(?(2)(?!))\b(phrase2)\b.*?)){2}:, ওয়ে 2: (?=.*\bphrase1\b)(?=.*\bphrase2\b)যেখানে এতে, অনুচ্ছেদের সংজ্ঞাটি আনুষ্ঠানিক না হওয়া পর্যন্ত এই ক্ষেত্রে অনুচ্ছেদের মিলটি অপরিজ্ঞাত।

উত্তর:


385

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

আদর্শ (যেমন পার্ল / জাভা) স্বরলিপিটি হ'ল:

(?=expr)

এর অর্থ "ম্যাচ এক্সপ্রেস তবে এর পরে মূল মিল-পয়েন্টে ম্যাচ চালিয়ে যাওয়া।"

আপনি নিজের ইচ্ছামতো এগুলি করতে পারেন এবং এটি একটি "এবং" হবে। উদাহরণ:

(?=match this expression)(?=match this too)(?=oh, and this)

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


3
perl -e "q {কিছু স্টাফ এবং জিনিস} = ~ / (? = কিছু) (? = স্টাফ) (? = জিনিস) /? মুদ্রণ 'হ্যাঁ': মুদ্রণ 'না'" প্রিন্ট 'না'।
রবার্ট পি

27
এটি উল্লেখ করা উচিত যে এই নির্দিষ্ট উদাহরণটিকে একটি ইতিবাচক বর্ণনাকারী জোর বলা হয় called "এবং" ব্যতীত এর অন্যান্য ব্যবহার রয়েছে। মনে রাখবেন যে পাঠ্যটি গ্রাস করা হয়নি।
স্ট্রেগার

7
(? =) এর মতো ব্যবহার করে কোনও রেজেক্সের ফলাফল হয় যা কখনই সফল হয় না। কিন্তু এটা হয় করা একত্রে এনালগ |। ওপি তার সমস্যার সমাধান করবে বলে মনে করে তার মধ্যে ঠিক ভুল।
নিটেচে-জৌ

10
perl -e "q {কিছু স্টাফ এবং জিনিস} = ~ /(?=.*some)(?=.*stuff)(?=.*things)/? 'হ্যাঁ': মুদ্রণ 'না'"
ক্রিস

3
আপনি দয়া করে আপনার উত্তরে পারল কোডে কিছু সহজ উদাহরণ যুক্ত করতে পারেন?
পিথিকোস

343

অন্যান্য প্রতিক্রিয়াশীলদের মধ্যে কেউ কেউ যেমন বলেছিলেন তেমনভাবে আপনাকে লুকহ্যাড ব্যবহার করা দরকার তবে তার লক্ষ্য শব্দ এবং বর্তমান ম্যাচের অবস্থানের মধ্যে লুকের হেডকে অন্যান্য চরিত্রের জন্য অ্যাকাউন্ট করতে হবে। উদাহরণ স্বরূপ:

(?=.*word1)(?=.*word2)(?=.*word3)

.*প্রথম lookahead এটা এটা আগেই "WORD1" পায় প্রয়োজন যদিও বহু অক্ষর মেলে দেয়। তারপরে ম্যাচের অবস্থানটি পুনরায় সেট করা হয় এবং দ্বিতীয় চেহারাটি "ওয়ার্ড 2" সন্ধান করে out আবার রিসেট করুন, এবং চূড়ান্ত অংশটি "শব্দ 3" এর সাথে মেলে; যেহেতু এটি আপনি শেষ শব্দটি যাচাই করছেন, এটি প্রয়োজনমুখে হওয়া উচিত নয়, তবে এটি কোনও ক্ষতি করে না।

একটি সম্পূর্ণ অনুচ্ছেদের সাথে মিল রাখতে, আপনাকে উভয় প্রান্তে রেজেক্স অ্যাঙ্কর করতে হবে এবং .*অবশিষ্ট অক্ষরগুলি গ্রাস করতে একটি ফাইনাল যুক্ত করতে হবে। পার্ল-স্টাইলের স্বরলিপি ব্যবহার করে, এটি হবে:

/^(?=.*word1)(?=.*word2)(?=.*word3).*$/m

'এম' সংশোধক মাল্টলাইন মোডের জন্য; এটা করতে দেয় ^এবং $অনুচ্ছেদ সীমানা ( "লাইন গণ্ডি" Regex কথা বলার মধ্যে) এ ম্যাচ। এটি এক্ষেত্রে অপরিহার্য যে আপনি 'গুলি' সংশোধকটি ব্যবহার করবেন না , যা ডট মেটাচার্যাক্টরকে নতুন লাইনের পাশাপাশি অন্য সমস্ত অক্ষরের সাথে মেলে।

শেষ অবধি, আপনি নিশ্চিত করতে চান যে আপনি পুরো শব্দের সাথে মিলে যাচ্ছেন এবং কেবলমাত্র দীর্ঘ শব্দের টুকরো নয়, তাই আপনাকে শব্দের সীমানা যুক্ত করতে হবে:

/^(?=.*\bword1\b)(?=.*\bword2\b)(?=.*\bword3\b).*$/m

8
ঠিক ঠিক - এটি সম্পর্কে একটি টিউটোরিয়ালও আছে! ocpsoft.org/tutorials/regular-expressionions/and-in-regex
লিংকন

9
অনেক অনেক ধন্যবাদ। * এটি একটি পার্থক্য
Gennadiy Ryabkin

1
স্পষ্ট এবং সংক্ষিপ্ত উত্তরের জন্য লুকোহেডগুলির জন্য সেরা ব্যবহারগুলির একটি প্রদর্শন করে (পাসওয়ার্ডের শতাংশের মিলটি গণনা করার জন্য হ্যাকের মতো ব্যবহারের বিপরীতে)। :)
zx81

1
@Liam :. মাইএসকিউএল পসিক্স পূর্ব স্বাদ ব্যবহার করে, তাই না। এটি কার্যকরভাবে পারফরম্যান্সের পক্ষে বৈশিষ্ট্যগুলি ত্যাগ করে, যা আমার কাছে যুক্তিসঙ্গত বলে মনে হয়। এখানে আরও তথ্য আছে
অ্যালান মুর

3
জাভাস্ক্রিপ্টের .*সাথে প্রতিস্থাপন করুন [\s\S]*যদি আপনার কাছে নতুন লাইন রয়েছে যেমন .জাভাস্ক্রিপ্টের রেজেক্স ইঞ্জিনটি নতুন লাইনের সাথে মেলে না এবং মডিফায়ারগুলির সাথে তৈরি করা যায় না
ওয়েসলি স্মিথ

41

এই উদাহরণটি দেখুন:

আমাদের কাছে A এবং B এর ২ টি রিজেক্সপস রয়েছে এবং আমরা উভয়কেই মিলাতে চাই, সুতরাং সিউডো কোডে এটি দেখতে এটির মতো দেখাচ্ছে:

pattern = "/A AND B/"

এটি AND অপারেটরটি এভাবে ব্যবহার না করেই লেখা যায়:

pattern = "/NOT (NOT A OR NOT B)/"

পিসিআরই মধ্যে:

"/(^(^A|^B))/"

regexp_match(pattern,data)

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

@মারভিন_ডিআরপি সিএমকেতে এটি আমার পক্ষে কাজ করেছিল, অন্য পরামর্শটি (?=expr)না করে। এটি বাস্তবায়ন নির্ভর বলে মনে হচ্ছে।
মেলিবিয়াস

38
^রেজেক্স সিনট্যাক্সে "স্ট্রিংয়ের শুরু" মানে কি না ?
লাম্বদা পরী

3
সাধারণভাবে রেজেক্সে, ^কেবলমাত্র একটি চরিত্র শ্রেণির শুরুতে প্রত্যাখ্যান। সিএমকে যদি সত্যিই মজার কিছু না করে (তাদের প্যাটার্নের সাথে মেলে এমন ভাষার "রেজেক্স" বলা ভুলভ্রান্ত বা ভুল হিসাবে বিবেচিত হতে পারে) আমি অনুমান করছি যে এটি আপনার পক্ষে কাজ করেছে এটি একটি বিচ্ছিন্ন দুর্ঘটনা ছিল।
ট্রিপলি

29

আপনি এটি নিয়মিত প্রকাশের মাধ্যমে করতে পারেন তবে সম্ভবত আপনি অন্য কোনওটিকে চাইবেন। উদাহরণস্বরূপ, বেশ কয়েকটি regexp ব্যবহার করুন এবং যদি একটি ধারাটিতে তাদের একত্রিত করুন।

আপনি এই জাতীয় স্ট্যান্ডার্ড রিজেক্সের সাহায্যে সমস্ত সম্ভাব্য ক্রমশক্তি গণনা করতে পারেন (যে কোনও ক্রমে a, b এবং c এর সাথে মেলে):

(abc)|(bca)|(acb)|(bac)|(cab)|(cba)

তবে, আপনার যদি বেশ কয়েকটি শর্ত থাকে তবে এটি খুব দীর্ঘ এবং সম্ভবত অদক্ষ regexp করে makes

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


10
আমি মনে করি না যে আপনার দৃষ্টিভঙ্গি তাদের বিপর্যয়মূলক ব্যাকট্র্যাকিংয়ের সাথে 3 লুক হেডের চেয়ে বেশি অদক্ষ। অবশ্যই এটি লেখার জন্য দীর্ঘতর, তবে মনে রাখবেন যে আপনি সহজেই প্যাটার্নটি স্বয়ংক্রিয়ভাবে তৈরি করতে পারেন। দ্রষ্টব্য যে আপনি এটির সাথে ব্যর্থ হওয়ার জন্য আরও উন্নত করতে পারেন a(bc|cb)|b(ac|ca)|c(ab|ba)। এবং সর্বাধিক গুরুত্বপূর্ণ, আপনি এটি সমস্ত রেগেক্স স্বাদ সহ ব্যবহার করতে পারেন।
ক্যাসিমির এবং হিপপলিট

26

AND দেয়া হয় অন্তর্নিহিত RegExp সিনট্যাক্স হবে।
OR অপারেটরটির পরিবর্তে পাইপের সাহায্যে নির্দিষ্ট করতে হবে।
নিম্নলিখিত RegExp:

var re = /ab/;

চিঠি মানে a এবং চিঠি b
এটি গ্রুপগুলির সাথেও কাজ করে:

var re = /(co)(de)/;

এর অর্থ গ্রুপ co এবং গ্রুপ de
(অন্তর্ভুক্ত) এবং একটি ওআর এর পরিবর্তে নিম্নলিখিত লাইনগুলির প্রয়োজন হবে:

var re = /a|b/;
var re = /(co)|(de)/;

29
দুর্ভাগ্যক্রমে, ওপি এটি চেয়েছিল না। এটি সেই ক্রমে কিছু খুঁজে পেয়েছে, যেখানে তারা যে কোনও ক্রমে সেগুলি চেয়েছিল। নীচে stackoverflow.com/users/20938/alan-moore দ্বারা উত্তরটি দেখুন যা সঠিক উত্তর ।
JESii

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

13

আপনার ক্ষেত্রে কি বেশ কয়েকটি মিলে যাওয়ার ফলাফলের জন্য AND করা সম্ভব নয়? সিউডোকোডে

regexp_match(pattern1, data) && regexp_match(pattern2, data) && ...

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

11

কেন বাজে ব্যবহার করবেন না?
অ্যাজিক রেজেক্স সহ এবং, বা বিষয়গুলি এত সহজ

awk '/WORD1/ && /WORD2/ && /WORD3/' myfile

9

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

উদাহরণ স্বরূপ

(?=[1-9][0-9]{2})[0-9]*[05]\b

সংখ্যাগুলি 100 এর চেয়ে বেশি এবং 5 দ্বারা বিভাজ্য হবে



8

স্বীকৃত উত্তর ছাড়াও

আমি আপনাকে কিছু ব্যবহারিক উদাহরণ প্রদান করব যা আপনার কারও কাছে বিষয়গুলি আরও স্পষ্ট হবে। উদাহরণস্বরূপ বলা যাক আমাদের সেই তিনটি লাইনের পাঠ্য রয়েছে:

[12/Oct/2015:00:37:29 +0200] // only this + will get selected
[12/Oct/2015:00:37:x9 +0200]
[12/Oct/2015:00:37:29 +020x]

এখানে ডেমো দেখুন ডেমো

আমরা এখানে যা করতে চাই তা হল + চিহ্নটি নির্বাচন করা তবে এটি যদি কেবল কোনও স্থানের সাথে দুটি সংখ্যার পরে হয় এবং এটি যদি চার সংখ্যার আগে হয়। সেগুলি কেবলমাত্র বাধা। আমরা এটি অর্জনের জন্য এই নিয়মিত প্রকাশটি ব্যবহার করব:

'~(?<=\d{2} )\+(?=\d{4})~g'

নোট করুন আপনি যদি প্রকাশটি আলাদা করেন তবে এটি আপনাকে আলাদা ফলাফল দেবে।

অথবা আপনি ট্যাগের মধ্যে কিছু পাঠ্য নির্বাচন করতে চান ... তবে ট্যাগ নয়! তারপরে আপনি ব্যবহার করতে পারেন:

'~(?<=<p>).*?(?=<\/p>)~g'

এই পাঠ্যের জন্য:

<p>Hello !</p> <p>I wont select tags! Only text with in</p> 

এখানে ডেমো দেখুন ডেমো


কোন উত্তর গৃহীত উত্তর ছিল? ভবিষ্যতে আমার জন্য এটিতে একটি লিঙ্ক যুক্ত করুন।
জেমস ব্রাউন

6

ক্রমটি সর্বদা নিয়মিত অভিব্যক্তির কাঠামোতে অন্তর্ভুক্ত থাকে। আপনি যা চান তা সম্পাদন করতে আপনাকে বিভিন্ন এক্সপ্রেশনের বিপরীতে একাধিকবার ইনপুট স্ট্রিংটি মিলাতে হবে।

আপনি যা করতে চান তা একটি একক রেজিপ্সপ দিয়ে সম্ভব নয়


এটি প্রযুক্তিগতভাবে অসম্ভব নয়, তবে এটি কার্যকর করা সার্থক নয়। আমি কেন জানি না কেন কেউ কমিয়ে দিয়েছে ...
রবার্ট পি

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

3

নিয়মিত প্রকাশের বাইরে এবং ব্যবহার করুন। পিএইচপি লুকেহেড অপারেটরটি আমার পক্ষে কাজ করে বলে মনে হয় না, পরিবর্তে আমি এটি ব্যবহার করেছি

if( preg_match("/^.{3,}$/",$pass1) && !preg_match("/\s{1}/",$pass1))
    return true;
else
    return false;

পাসওয়ার্ডের দৈর্ঘ্য 3 অক্ষর বা তার বেশি হলে এবং পাসওয়ার্ডে কোনও ফাঁকা স্থান না থাকলে উপরের রেজেক্সটি মিলবে।

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