একটি নিয়মিত প্রকাশের বিষয় স্ট্রিংয়ে সাদা স্থানকে কীভাবে উপেক্ষা করবেন?


107

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

উত্তর:


124

আপনি \s*আপনার রেগেক্সের প্রতিটি অন্যান্য চরিত্রের মধ্যে alচ্ছিক শ্বেতস্পেস অক্ষর আটকে রাখতে পারেন । অনুমোদিত হলেও এটি কিছুটা দীর্ঘ হবে।

/cats/ -> /c\s*a\s*t\s*s/


ধন্যবাদ, শোনাবার মতো উপায়। তবে আমি কেবল বুঝতে পেরেছি যে তারা কেবল নতুন লাইন অনুসরণ করে তবে আমি কেবলমাত্র alচ্ছিক সাদা স্থানের অক্ষর চাই want সুতরাং উদাহরণস্বরূপ, "c \ n ats" বা "ca \ n ts" মিলবে। তবে নতুন লাইন না থাকলে "সি এটিস" মিলবে না। এটি কীভাবে করা যায় তার কোনও ধারণা?
স্টিভেন

@ স্টিভেন, দেখুন কীভাবে আমি নীচে এটি করেছি, আপনি সহজেই এই জাতীয় নির্দিষ্ট ক্ষেত্রে আমার সমাধানটি মানিয়ে নিতে পারেন।
বব

@ ক্রিস আমি মনে করি, এই রেজেক্স কেবল বিড়ালদের জন্যই কঠোর, এটি কোনও চিঠির সন্ধানের জন্যও এটি লিখতে পারে: ^([a-z]\s*)+$
সন্দীপ কৌর

9

স্যাম ডুফেলের উত্তরে স্টিভেনের মন্তব্যে সম্বোধন করা

ধন্যবাদ, শোনাবার মতো উপায়। তবে আমি কেবল বুঝতে পেরেছি যে তারা কেবল নতুন লাইন অনুসরণ করে তবে আমি কেবলমাত্র alচ্ছিক সাদা স্থানের অক্ষর চাই want সুতরাং উদাহরণস্বরূপ, "c \ n ats" বা "ca \ n ts" মিলবে। তবে নতুন লাইন না থাকলে "সি এটিস" মিলবে না। এটি কীভাবে করা যায় তার কোনও ধারণা?

এই কৌতুক করতে হবে:

/c(?:\n\s*)?a(?:\n\s*)?t(?:\n\s*)?s/

'বিড়াল' এর সাথে মেলে এমন সমস্ত ভিন্নতার জন্য এই পৃষ্ঠাটি দেখুন ।

আপনি এটি কন্ডিশনাল ব্যবহার করেও সমাধান করতে পারেন , তবে তারা রেজেক্সের জাভাস্ক্রিপ্টের স্বাদে সমর্থিত নয়।


3
খুব কুৎসিত। আরও ভাল উপায় থাকতে হবে।
james.garriss

আপনি এটিকে জেএস সিনট্যাক্সে আরও পঠনযোগ্য করে তুলতে পারেন (যদিও কৌশলটি অন্যান্য ভাষায় কাজ করবে):new RegExp('cats'.split('').join('(?:\n\s*)?'))
ব্রায়ানারি

7

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

আপনি যদি "আমার বিড়াল" অনুসন্ধান করতে চান তবে এর পরিবর্তে:

myString.match(/m\s*y\s*c\s*a\*st\s*s\s*/g)

শুধু কর:

myString.replace(/\s*/g,"").match(/mycats/g)

সতর্কতা: আপনি খালি স্ট্রিং দিয়ে সমস্ত স্পেস প্রতিস্থাপন করে নিয়মিত প্রকাশের এটিকে স্বয়ংক্রিয় করতে পারবেন না কারণ এগুলি অবহেলায় ঘটতে পারে অথবা অন্যথায় আপনার নিয়মিত অভিব্যক্তিটিকে অবৈধ করে তুলতে পারে।


5

আপনি \s*আপনার অনুসন্ধানের স্ট্রিংয়ের প্রতিটি চরিত্রকে অভ্যন্তরীণভাবে রাখতে পারেন যাতে আপনি যদি বিড়ালের সন্ধান করেন তবে আপনি ব্যবহার করতে পারেনc\s*a\s*t\s*s\s*s

এটি দীর্ঘ তবে আপনি অবশ্যই স্ট্রিংটি গতিময়ভাবে তৈরি করতে পারেন।

আপনি এটি এখানে কাজ করতে দেখতে পান: http://www.rubular.com/r/zzWwvppSpE


3

আপনি যদি কেবলমাত্র স্থানগুলিতে অনুমতি দিতে চান তবে

\bc *a *t *s\b

এটা করা উচিত। ট্যাবগুলিকেও অনুমতি দিতে, ব্যবহার করুন

\bc[ \t]*a[ \t]*t[ \t]*s\b

\bআপনি যদি বা এর catsমতো শব্দের মধ্যে সন্ধান করতে চান তবে অ্যাঙ্করগুলি সরিয়ে ফেলুন ।bobcatscatsup


1

এই পদ্ধতির এটি স্বয়ংক্রিয়ভাবে ব্যবহার করতে ব্যবহার করা যেতে পারে (নিম্নলিখিত উদাহরণস্বরূপ সমাধানটি অজগরটিতে রয়েছে, যদিও স্পষ্টতই এটি কোনও ভাষায় পোর্ট করা যেতে পারে):

আপনি পূর্বেই সাদা স্থানটি ছিনিয়ে নিতে পারেন এবং অ-হোয়াইটস্পেস অক্ষরগুলির অবস্থানগুলি সংরক্ষণ করতে পারেন যাতে আপনি নীচের মত মূল স্ট্রিংয়ের সাথে ম্যাচিং স্ট্রিংয়ের সীমানা অবস্থানগুলি খুঁজে পেতে পরবর্তীগুলি ব্যবহার করতে পারেন:

def regex_search_ignore_space(regex, string):
    no_spaces = ''
    char_positions = []

    for pos, char in enumerate(string):
        if re.match(r'\S', char):  # upper \S matches non-whitespace chars
            no_spaces += char
            char_positions.append(pos)

    match = re.search(regex, no_spaces)
    if not match:
        return match

    # match.start() and match.end() are indices of start and end
    # of the found string in the spaceless string
    # (as we have searched in it).
    start = char_positions[match.start()]  # in the original string
    end = char_positions[match.end()]  # in the original string
    matched_string = string[start:end]  # see

    # the match WITH spaces is returned.
    return matched_string

with_spaces = 'a li on and a cat'
print(regex_search_ignore_space('lion', with_spaces))
# prints 'li on'

আপনি যদি আরও যেতে চান তবে আপনি ম্যাচ অবজেক্টটি তৈরি করতে পারেন এবং পরিবর্তে এটি ফিরিয়ে দিতে পারেন, সুতরাং এই সহায়কটির ব্যবহার আরও সহজ হবে।

এবং এই ফাংশনটির পারফরম্যান্স অবশ্যই অনুকূলিত করা যায়, এই উদাহরণটি কেবল কোনও সমাধানের পথ দেখানোর জন্য।

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