একটি নিয়মিত অভিব্যক্তিতে কীভাবে "অক্ষরের এই ক্রম অবধি কিছু মিলবে"?


514

এই নিয়মিত প্রকাশটি নিন: /^[^abc]/। এটি স্ট্রিংয়ের শুরুতে যে কোনও একক অক্ষরের সাথে মিলবে, এ, বি, বা সি ব্যতীত।

যদি আপনি এর *পরে কিছু যোগ করেন - /^[^abc]*/- নিয়মিত প্রকাশটি পরবর্তী প্রতিটি অক্ষরকে ফলাফলের সাথে যুক্ত করতে থাকবে, যতক্ষণ না এটি কোনও a, বা b , বা পূরণ হয় c

উদাহরণস্বরূপ, উত্স স্ট্রিং সহ "qwerty qwerty whatever abc hello", এক্সপ্রেশনটি মিলবে "qwerty qwerty wh"

তবে আমি চাইলে ম্যাচিং স্ট্রিংটি কী হতে পারে "qwerty qwerty whatever "

... অন্য কথায়, আমি কীভাবে সমস্ত কিছুর সাথে যথাযথ ক্রম (তবে অন্তর্ভুক্ত না করে) মেলে পারি "abc"?


আপনি কি বলতে চাইছেন match but not including?
টোটো

5
আমি বোঝাতে চাই যে আমি ম্যাচ করতে চাই "qwerty qwerty whatever "- "এবিসি" সহ নয়। অন্য কথায়, আমি না ফলে ম্যাচ হতে চাই "qwerty qwerty whatever abc"
কলম্ব

2
জাভাস্ক্রিপ্ট আপনি ঠিক করতে পারেন do string.split('abc')[0]। অবশ্যই এই সমস্যার কোনও অফিসিয়াল উত্তর নয়, তবে আমি এটি রেজেক্সের চেয়ে আরও সোজা বলে মনে করি।
উইলিয়াম জড

উত্তর:


1020

আপনি কোন রেজেক্সের স্বাদ ব্যবহার করছেন তা নির্দিষ্ট করেননি তবে এটি "সম্পূর্ণ" হিসাবে বিবেচিত হতে পারে এমন কোনও জনপ্রিয় ক্ষেত্রে কাজ করবে।

/.+?(?=abc)/

কিভাবে এটা কাজ করে

.+? অংশ আন-লোভী সংস্করণ .+ (এক বা কিছু বেশি)। যখন আমরা ব্যবহার করি .+, ইঞ্জিনটি মূলত সমস্ত কিছুর সাথে মিলবে। তারপরে, যদি রেজেক্সে অন্য কোনও কিছু থাকে তবে এটি নীচের অংশটির সাথে মেলে চেষ্টা করার পদক্ষেপে ফিরে যাবে। এটি লোভী আচরণ, যতটা সম্ভব সন্তুষ্ট করা অর্থ ।

ব্যবহার করার সময় .+?, একবারে সমস্ত মিলে যাওয়া এবং অন্যান্য অবস্থার (যদি থাকে তবে) ফিরে যাওয়ার পরিবর্তে ইঞ্জিন পরবর্তী অক্ষরগুলির সাথে ধাপে ধাপে মিলবে যতক্ষণ না রেজেক্সের পরবর্তী অংশটি মিলে যায় (আবার যদি থাকে)। এটি অ-লোভী , যার অর্থ সন্তুষ্ট করার পক্ষে খুব কম সংখ্যক লোকের সাথে মেলে ।

/.+X/  ~ "abcXabcXabcX"        /.+/  ~ "abcXabcXabcX"
          ^^^^^^^^^^^^                  ^^^^^^^^^^^^

/.+?X/ ~ "abcXabcXabcX"        /.+?/ ~ "abcXabcXabcX"
          ^^^^                          ^

আমাদের অনুসরণ করে একটি শূন্য প্রস্থের দৃser়তা , চারপাশে এক নজর । এই গোষ্ঠীভুক্ত নির্মাণটি এর বিষয়বস্তুর সাথে মেলে তবে মিলের অক্ষর ( শূন্য প্রস্থ ) হিসাবে গণনা করা হয় না । এটি কেবলমাত্র যদি এটি ম্যাচ হয় বা না হয় ( দৃ returns ়তা ) ফেরত দেয় returns(?={contents})

সুতরাং, অন্য পদগুলিতে রেজেক্সের /.+?(?=abc)/অর্থ:

"Abc" গণনা না করে "ABC" না পাওয়া অবধি যতগুলি অক্ষর সম্ভব তার সাথে মিল করুন।


12
এটি সম্ভবত লাইন ব্রেকগুলির সাথে কাজ করবে না, যদি তাদের ক্যাপচার করার কথা।
আইনর্ড

3
মধ্যে পার্থক্য কি .+?এবং .*?
রবি

4
@ robbie0630 এর +অর্থ 1 বা ততোধিক, যেখানে *0 বা ততোধিক। অন্তর্ভুক্তি / অন্তর্ভুক্তি ?এটিকে লোভী বা অ-লোভী করে তুলবে।
জিঙ্গলেস্তুলা

2
@ testerjoe2 /.++?(?=abcmittedxyz)/
ওয়ারেন্সবি

4
আমি লক্ষ্য করেছি যে আপনার সন্ধানের প্যাটার্নটি যদি বিদ্যমান না থাকে তবে এটি কোনও কিছু নির্বাচন করতে ব্যর্থ হয়েছে, পরিবর্তে আপনি যদি ^(?:(?!abc)(?!def).)*চান না এমন প্যাটার্নগুলি বাদ দেওয়ার জন্য আপনি চেইন করতে পারেন এবং প্যাটার্নটি উপস্থিত না থাকলেও এটি প্রয়োজনীয়ভাবে সমস্ত কিছু দখল করবে
করণ শিশু

121

আপনি যদি সবকিছু "অ্যাবিসি" পর্যন্ত ক্যাপচার করতে চান তবে:

/^(.*?)abc/

ব্যাখ্যা:

( )ব্যবহার অ্যাক্সেসের জন্য প্রথম বন্ধনী ভিতরে অভিব্যক্তি ক্যাপচার $1, $2ইত্যাদি

^ লাইন ম্যাচ শুরু

.*?অ-লোভনীয়ভাবে যেকোন কিছু মিল করুন (প্রয়োজনীয় ন্যূনতম সংখ্যার সাথে মেলে) - [1]

[1] এটির প্রয়োজনীয়তার কারণটি হ'ল অন্যথায় নিম্নলিখিত স্ট্রিংয়ে:

whatever whatever something abc something abc

ডিফল্টরূপে, রেজেক্সগুলি লোভী , যার অর্থ এটি যথাসম্ভব মিলবে। অতএব /^.*abc/"কিছু কিছু যাই হোক না কেন কিছু হোক না কেন" মিলবে। অ-লোভী কোয়ান্টিফায়ার যুক্ত করা ?রেগেক্সকে কেবল "যাই কিছু হোক না কেন" মিলায়।


4
ধন্যবাদ, কিন্তু আপনার এক করে ম্যাচে এবিসি অন্তর্ভুক্ত। অন্য কথায় ফলাফল মিলছে "যাই হোক না কেন কিছু কিছু হোক না কেন" match
কলম্ব

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

sedঅ-লোভী মিলকে সমর্থন করে বলে মনে হচ্ছে না, বা এটি চারপাশে ( (?=...)) সমর্থন করে না । আমি আর কী করতে পা্রি? উদাহরণ কমান্ড: echo "ONE: two,three, FOUR FIVE, six,seven" | sed -n -r "s/^ONE: (.+?), .*/\1/p"প্রত্যাবর্তন two,three, FOUR FIVE, তবে আমি প্রত্যাশা করি two,three...
CodeManX

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

3
এই হল কিভাবে প্রতি regexp উত্তর উচিত চেহারা - উদাহরণস্বরূপ এবং সব অংশে ব্যাখ্যা ...
jave.web

54

যেমন @ জ্যারেড এনজি এবং @ ইসসন উল্লেখ করেছেন যে, এই ধরণের RegEx সমাধান করার মূল কী যেমন "একটি নির্দিষ্ট শব্দের সাথে সমস্ত কিছু মিলে মিশ্রিত করা" বা "একটি নির্দিষ্ট শব্দের সাথে সমস্ত কিছু মিলে মিশ্রিত করা" বলা হয় "বর্ণমালা" শূন্য-দৈর্ঘ্যের দাবী । এখানে তাদের সম্পর্কে আরও পড়ুন।

আপনার বিশেষ ক্ষেত্রে এটি ইতিবাচক চেহারা দিয়ে সমাধান করা যেতে পারে: .+?(?=abc)

একটি ছবি হাজার শব্দের সমান. স্ক্রিনশটে বিস্তারিত ব্যাখ্যা দেখুন।

Regex101 স্ক্রিনশট


23
.+?(?=abc)কপি-পাস্টেবল রেইগেক্স আরও মূল্যবান।
টম

শীর্ষস্থানীয় স্থানগুলি বাদ দিয়ে কী হবে?
রায়

8

আপনার যা প্রয়োজন তা হ'ল দৃ .়তা হিসাবে প্রায় দেখুন .+? (?=abc)

দেখুন: লুকোহেড এবং লুকোহাইন্ডের শূন্য-দৈর্ঘ্যের প্রতিবেদনগুলি

সচেতন থাকুন যা এর [abc]মতো নয় abc। বন্ধনীগুলির ভিতরে এটি একটি স্ট্রিং নয় - প্রতিটি অক্ষর সম্ভাবনার মধ্যে একটি মাত্র। বন্ধনীগুলির বাইরে এটি স্ট্রিং হয়ে যায়।


7

জাভাতে রেইজেক্সের জন্য, এবং আমি বেশিরভাগ রেজেক্স ইঞ্জিনগুলিতেও বিশ্বাস করি, আপনি যদি শেষ অংশটি অন্তর্ভুক্ত করতে চান তবে এটি কাজ করবে:

.+?(abc)

উদাহরণস্বরূপ, এই লাইনে:

I have this very nice senabctence

"abc" অবধি সমস্ত অক্ষর নির্বাচন করুন এবং এ.বি.সি.

আমাদের রেজেক্স ব্যবহার করে, ফলাফলটি হবে: I have this very nice senabc

এটি পরীক্ষা করে দেখুন: https://regex101.com/r/mX51ru/1


4

আমার সমস্যা সমাধানের জন্য সাহায্যের সন্ধানের পরে আমি এই স্ট্যাকওভারফ্লো প্রশ্নটিতে শেষ হয়েছি তবে এর কোনও সমাধান পাইনি :(

সুতরাং আমাকে ইমপ্রাইভ করতে হয়েছিল ... কিছু সময়ের পরে আমি আমার প্রয়োজনীয় রেজিজেসে পৌঁছাতে সক্ষম হয়েছি:

এখানে চিত্র বর্ণনা লিখুন

আপনি দেখতে পাচ্ছেন, শেষ ড্যাশ না করে আমার "জিআরপি-বিপিএস" ফোল্ডারটির আগে একটি ফোল্ডার প্রয়োজন। এবং "grp-bps" ফোল্ডারের পরে কমপক্ষে একটি ফোল্ডার থাকা দরকার ছিল।

সম্পাদন করা

অনুলিপি-পেস্টের জন্য পাঠ্য সংস্করণ (আপনার পাঠ্যের জন্য 'grp-bps' পরিবর্তন করুন):

.*\/grp-bps\/[^\/]+

6
কোনও পাঠ্য সংস্করণ নেই? 🙄
কিরাদোটি

2

এটি রেজেেক্স সম্পর্কে ধারণা তৈরি করবে।

  1. নিম্নলিখিত শব্দটির কমান্ড থেকে সঠিক শব্দটি পাওয়া যাবে:

( "(। *?)") / ছ

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

এটি "ডাবল উদ্ধৃত" শব্দের উদাহরণ example

তারপরে আমরা সেই বাক্যটি থেকে "ডাবল কোটড" পাব।


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

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

2

অজগরকে:

.+?(?=abc) একক লাইন কেস জন্য কাজ করে।

[^]+?(?=abc)কাজ করে না, যেহেতু পাইথন [^] কে বৈধ রেজেক্স হিসাবে স্বীকৃতি দেয় না। মাল্টলাইনের সাথে ম্যাচিংয়ের কাজ করতে আপনাকে পুনরায় ডটল বিকল্পটি ব্যবহার করতে হবে, উদাহরণস্বরূপ:

re.findall('.+?(?=abc)', data, re.DOTALL)

0

আমি বিশ্বাস করি আপনার সুব্যাক্রেশন দরকার need যদি আমার ঠিক মনে থাকে তবে আপনি ()সাউব এক্সপ্রেশনের জন্য সাধারণ বন্ধনী ব্যবহার করতে পারেন ।

এই অংশটি গ্রেপ ম্যানুয়াল থেকে:

 Back References and Subexpressions
       The back-reference \n, where n is a single digit, matches the substring
       previously matched  by  the  nth  parenthesized  subexpression  of  the
       regular expression.

^[^(abc)]কৌশলটি করা উচিত এমন কিছু করুন ।


দুঃখিত, এটি কাজ করে না। আবেরকে বন্ধনীতে রাখলে কোনও পার্থক্য মনে হয় না seem তাদের এখনও "একটি বা বি বা সি" হিসাবে চিকিত্সা করা হয়।
কলম্ব

-1

$চিহ্ন একটি স্ট্রিং এর শেষে, তাই ভালো কিছু কাজ করা উচিত: [[^abc]*]$যেখানে আপনি কিছু কোন পুনরাবৃত্তির শেষ হওয়া নয় খুঁজছেনabc , কিন্তু এটা শেষ হতে হবে

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


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