রেজেক্স: একটি চরিত্রের প্রথম উপস্থিতির সাথে মিলছে


356

আমি এমন একটি প্যাটার্ন খুঁজছি যা নির্দিষ্ট চরিত্রের প্রথম উপস্থিতি পর্যন্ত সমস্ত কিছুর সাথে মেলে , বলুন ";" - একটি সেমিকোলন

আমি এটি লিখেছি:

/^(.*);/

তবে এটি সেমিকোলনের শেষ ঘটনা অবধি সমস্ত কিছুর সাথে (সেমিকোলন সহ) মেলে।


65
/^(.*?);/এছাড়াও কাজ করা উচিত (একে লোভী বলা হয় ), তবে প্রদত্ত উত্তরগুলি [^;]*আরও ভাল better
পাস্কাল

সেমিকোলনের পরে আপনি কীভাবে সবকিছু বেছে নেবেন এবং সেমিকোলন নিজেই নয়।
মুহম্মদ উমর

এই কাজগুলি দেখুন \w+(?!([^]+;)|;)তবে এটি কেন হয় না? .+(?!([^]+;)|;)
মুহাম্মাদ উমর

1
পাস্কল, আপনার উত্তর লেখা উচিত ছিল!
শান ক্যান্ডেল

@ পাসল এটি উত্তর হিসাবে উপযুক্ত! ধন্যবাদ!
neverMind9

উত্তর:


503

তোমার দরকার

/[^;]*/

[^;]একটি হল চরিত্র শ্রেণী , সবকিছু কিন্তু একটি সেমিকোলন সাথে মেলে।

perlreমানচিত্রটি উদ্ধৃত করার জন্য:

আপনি [] এর মধ্যে অক্ষরের একটি তালিকা বদ্ধ করে একটি অক্ষর শ্রেণি নির্দিষ্ট করতে পারেন যা তালিকার কোনও অক্ষরের সাথে মিলবে। "[" "" ^ "এর পরে যদি প্রথম অক্ষর হয় তবে শ্রেণি তালিকার সাথে নয় এমন কোনও অক্ষরের সাথে মেলে।

এটি বেশিরভাগ রেজেক্স উপভাষায় কাজ করা উচিত।


এই সমাধানটি সম্পর্কে দুর্দান্ত অংশটি হ'ল লাইনটির শেষের সাথেও মেলে, যেমন আমার ক্ষেত্রে আমার ছিল foo=bar;baz=bax;bab=bafএবং এটি আমার সাথে কী মিলছে bab=bafতার ;ঠিক কোনও মিল নেই । নিশ্চিত নয় কেন এটি যদি কাজ করে তবে যদিও লক্ষ্যটি প্রতীক ছাড়া সমস্ত চিহ্নের সাথে মেলে ...
স্ক্রিভেটস

303

না;

/^(.*?);/

কাজ করে?

?একটি অলস অপারেটর, তাই Regex মিলে সামনে সম্ভব হিসাবে সামান্য হিসাবে দখল হয় ;


4
হ্যাঁ, তবে টিম টোডির বাইকার্বোনেট বর্ধনের পরে, আমি বিশ্বাস করি যে অলস কোয়ান্টিফায়ার ব্যাকট্র্যাকিংয়ের অন্তর্ভুক্ত হওয়ায় অবহেলিত চরিত্রের ক্লাসগুলি জিতবে। যাইহোক +1।
আমারঘোষ

3
পারফরম্যান্সের বিষয়টিতে
গ্লেন স্লেভেন

38

/^[^;]*/

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


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

4
তিনি বলেছিলেন যে সেমিকোলনের প্রথম ঘটনাটি না হওয়া পর্যন্ত তিনি সবকিছুর সাথে মিল রাখতে চেয়েছিলেন, তাই আমি ধরে নিয়েছিলাম যে তিনি স্ট্রিংয়ের শুরু থেকেই বোঝাতে চেয়েছিলেন।
গ্লেন স্লেভেন



8

নমুনা পাঠ:

"this is a test sentence; to prove this regex; that is g;iven below"

উদাহরণস্বরূপ যদি আমাদের উপরে নমুনা পাঠ্য থাকে, রেজিেক্স /(.*?\;)/আপনাকে সেমিকোলন ( ;) সহ সেমিকোলন ( ) এর প্রথম উপস্থিতি পর্যন্ত আপনাকে সবকিছু দেবে :"this is a test sentence;"


3
;চর থেকে বেরিয়ে আসার দরকার নেই এটি বিশেষ চরিত্রের রেজেক্স নয়। গ্রুপিংয়ের ()পাশাপাশি প্রয়োজন হয় না। আপনি যেতে পারেন/.*?;/
Aliaksei Kliuchnikau

1
হ্যাঁ, আপনি ঠিক বলেছেন। পালানো "
দুঃখিতের

2
এই উত্তরটি আমি খুঁজছিলাম। তাহলে ? ম্যাচটি প্রথম ইভেন্টে শেষ করে দেয়? এর নাম কী ... (আসুন এটি কল করুন) রেইগেক্সের সম্পত্তি?
পার্জিফাল

1
@ পার্জিফল ?চরিত্রটি ম্যাচটিকে অলস করে তোলে (যতবার সম্ভব মিলছে)। প্রথম সেমিকোলন অবধি
রিজেক্স ম্যাচিংয়ের

5

এটি কোনও রেজেক্স সমাধান নয়, তবে আপনার সমস্যার বিবরণের জন্য যথেষ্ট সাধারণ। কেবল আপনার স্ট্রিংকে বিভক্ত করুন এবং আপনার অ্যারে থেকে প্রথম আইটেমটি পান।

$str = "match everything until first ; blah ; blah end ";
$s = explode(";",$str,2);
print $s[0];

আউটপুট

$ php test.php
match everything until first

5

এটি আমার জন্য খুব সহায়ক ছিল কারণ আমি বৈশিষ্ট্যগুলি সহ একটি এক্সএমএল ট্যাগে সমস্ত অক্ষর কীভাবে মেলে তা বের করার চেষ্টা করছিলাম। আমি "শেষের সাথে সব কিছু মেলে" সমস্যা নিয়ে ছুটে চলেছি:

/<simpleChoice.*>/

তবে সমস্যাটি সমাধান করতে সক্ষম হয়েছিলেন:

/<simpleChoice[^>]*>/

এই পোস্ট পড়ার পরে। সবাইকে ধন্যবাদ.


1
আমি খুঁজে পেয়েছি যে এটি প্রকৃতভাবে পার্স করা আরও কার্যকর (প্রতিটি ভাষা বা ফ্রেমওয়ার্কের নিজস্ব ক্লাস রয়েছে) এইচটিএমএল / এক্সএমএল কারণ এটির মেশিনের ফর্ম্যাট, রেজেক্সগুলি প্রাকৃতিক ভাষার জন্য।
লিওন ফেদটোভ

1
খুশী হলাম। আমি <!DOCTYPE>ট্যাগটিতে সিনট্যাক্স ত্রুটিযুক্ত xML ডকুমেন্টগুলি ঠিক করতে এটি ব্যবহার করেছি । যেহেতু পার্সার এটি পরিচালনা করতে সক্ষম ছিল না।
মার্টিন স্নাইডার

5

এটি কেবল প্রতিটি স্ট্রিংয়ের সাথে প্রথম সংঘটনটির সাথে মিলবে এবং পরবর্তী ঘটনাগুলি উপেক্ষা করবে।

/^([^;]*);*/

3

"/^([^\/]*)\/$/" আমার পক্ষে কাজ করেছে, যেমন একটি অ্যারের থেকে কেবলমাত্র শীর্ষ "ফোল্ডার" পেতে:

a/   <- this
a/b/
c/   <- this
c/d/
/d/e/
f/   <- this

2

সত্যিই দুঃখিত যে কেউ আপনাকে সঠিক উত্তর দেয় নি ...

রেজেক্সে,? এটি লোভী করে তোলে। ডিফল্ট হিসাবে রেজেক্স এটি যতটা মিলবে (লোভী)

কেবল একটি যুক্ত? এবং এটি লোভী হবে এবং যতটা সম্ভব সামান্য!

সৌভাগ্য, আশা যে সাহায্য করে।


3
এটি প্রচুরভাবে প্রকৃত রেজেক্স বাস্তবায়নের উপর নির্ভর করে এবং প্রতিটি বাস্তবায়নে অ-লোভী মোড থাকে না।
কারাতেডোগ

0

আমি এটি খুঁজে পেয়েছি

/^[^,]*,/

ভাল কাজ করে.

',' এখানে "ডিলিমিটার" হচ্ছে।

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