রেজেক্স: "স্পেস বা স্ট্রিংয়ের শুরু" এবং "স্পেস বা স্ট্রিংয়ের শেষ" নির্দিষ্ট করুন


127

কল্পনা করুন যে আপনি "স্ট্যাকওভারফ্লো" মিলানোর চেষ্টা করছেন।

আপনি নিম্নলিখিত চান:

 this is stackoverflow and it rocks [MATCH]

 stackoverflow is the best [MATCH]

 i love stackoverflow [MATCH]

 typostackoverflow rules [NO MATCH]

 i love stackoverflowtypo [NO MATCH]

আমি জানি যে কীভাবে স্ট্যাকওভারফ্লো পার্স করতে হবে যদি এটির ব্যবহার করে উভয় সাইটে ফাঁকা স্থান থাকে:

/\s(stackoverflow)\s/

এটি যদি স্ট্রিংয়ের শুরু বা শেষের দিকে থাকে তবে:

/^(stackoverflow)\s/

/\s(stackoverflow)$/

তবে আপনি কীভাবে "স্পেস বা স্ট্রিংয়ের শেষ" এবং "স্পেস বা স্ট্রিংয়ের শুরু" নিয়মিত এক্সপ্রেশন ব্যবহার করে নির্দিষ্ট করবেন?

উত্তর:


172

আপনি নিম্নলিখিত যে কোনও ব্যবহার করতে পারেন:

\b      #A word break and will work for both spaces and end of lines.
(^|\s)  #the | means or. () is a capturing group. 


/\b(stackoverflow)\b/

এছাড়াও, আপনি যদি আপনার ম্যাচের স্থানটি অন্তর্ভুক্ত করতে না চান তবে আপনি লুকহাইন্ড / এগিয়ে ব্যবহার করতে পারেন।

(?<=\s|^)         #to look behind the match
(stackoverflow)   #the string you want. () optional
(?=\s|$)          #to look ahead.

8
\bএকটি শূন্য প্রস্থের দাবী; এটি কখনও কোনও অক্ষর গ্রাস করে না। এটি দেখার জন্য জড়ো করার দরকার নেই।
অ্যালান মুর

2
নোট যে অধিকাংশ regexp বাস্তবায়নের এ, \bহয় শুধুমাত্র মান হওয়া ASCII , বলতে, কোন ইউনিকোড সমর্থন রয়েছে। আপনি যদি ইউনিকোড শব্দের সাথে মেলে প্রয়োজন হয় তবে আপনার পরিবর্তে এটি ব্যবহারের বিকল্প নেই: stackoverflow.com/a/6713327/1329367
মাহান

4
ম্যাচের গ্রুপ নির্বাচন বাদ করার সহজ উপায়(?:^|\s)
user2426679

7
অজগর জন্য, (?<=\s|^)সঙ্গে প্রতিস্থাপন (?:(?<=\s)|(?<=^))। অন্যথায়, আপনি পাবেনerror: look-behind requires fixed-width pattern
ব্যবহারকারী 2426679

4
\bঅন্যান্য অক্ষরের বিবেচনা করবে - যেমন " ." হিসাবে শব্দ-ভঙ্গকারী, প্রশ্নকর্তা বিশেষভাবে বলেন যেহেতু "স্পেস"। @ গর্ডির সমাধান আরও ভাল বলে মনে হচ্ছে।
মিখাইল টি।

65

(^|\s)স্পেসের সাথে মিলবে বা স্ট্রিংয়ের শুরু হবে এবং ($|\s)স্পেসের জন্য বা স্ট্রিংয়ের শেষ হবে। একসাথে এটি:

(^|\s)stackoverflow($|\s)

4
এই শুধুমাত্র আমার জন্য কাজ করে। আপনাকে ধন্যবাদ @ গর্ডি
রোবসনরোসা

2
আপনি যদি এই প্যাটার্নটি প্রতিস্থাপন করতে ব্যবহার করেন তবে প্যাটার্নটি প্রতিস্থাপন করে প্রতিস্থাপিত ফলাফলের মধ্যে ফাঁকা স্থানগুলি রাখার কথা মনে রাখবেন $1string$2
Mahn

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

17

আমি যা ব্যবহার করব তা এখানে:

 (?<!\S)stackoverflow(?!\S)

অন্য কথায়, "স্ট্যাকওভারফ্লো" মেলে যদি এটির আগে কোনও শ্বেতক্ষেত্রের অক্ষর থাকে না এবং শ্বেতক্ষেত্রের অক্ষর অনুসরণ না করে।

এটি "স্পেস-বা-অ্যাঙ্কর" পদ্ধতির চেয়ে আরও সুন্দর (আইএমও), এবং এটি স্ট্রিংটি শুরু করে এবং \bপদ্ধতির মতো শব্দ অক্ষরের সাথে শেষ হয় না বলে মনে করে।


1
কেন এটি ব্যবহার করবেন তা সম্পর্কে ভাল ব্যাখ্যা। আমি এটি বাছাই করতে পারি তবে পরীক্ষিত স্ট্রিংটি সর্বদা একক লাইন।
বেনামে এক-

7

\b শব্দের সীমানায় মিলবে (আসলে কোনও অক্ষরের সাথে মিল নেই), সুতরাং নিম্নলিখিতটি যা চান তা করা উচিত:

\bstackoverflow\b

পাইথনের জন্য এটি এটি একটি কাঁচা স্ট্রিং নির্দিষ্ট করতে সহায়তা করে , উদাহরণস্বরূপmystr = r'\bstack overflow\b'
একিউম্যানাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.