Regex স্ট্রিং.ম্যাচগুলি () এ কাজ করে না


147

আমার কাছে এই ছোট্ট কোড রয়েছে

String[] words = {"{apf","hum_","dkoe","12f"};
for(String s:words)
{
    if(s.matches("[a-z]"))
    {
        System.out.println(s);
    }
}

প্রিন্ট করার জন্য অনুমিত

dkoe

কিন্তু এটি কিছুই প্রিন্ট !!


41
জাভা আপনার matchesজন্য রেগেক্সেসের শেষে একটি the শুরুতে এবং একটি p রাখে। সুতরাং matches("[a-z]")প্রকৃতপক্ষে পরিবর্তে / ^ [এজেড] for / সন্ধান করবে।
রবিনো

হ্যাঁ @ রোবিনো আপনি একদম ঠিক বলেছেন।
মিহির

1
অবশ্যই, যদি আপনি matchesকোনও ঘটনার সন্ধানের প্রত্যাশা করেন [a-z], তবে এটি সমস্ত কি মিলবে? আমি matchesরেজেক্সের বিরুদ্ধে পৃথকভাবে প্রতিটি চরিত্র পরীক্ষা করার আশা করব না ।
ফিলহিবস

@ রোবিনো: সেই কার্যকারিতাটি কোথায় বর্ণিত / ডকুমেন্টেড?
তোড়ু

@ তোরু স্ট্রিং.ম্যাচগুলির জন্য জাভা ডক্স পৃষ্ঠায় - আর কোথায়? "জাভা স্ট্রিং ডকুমেন্টেশনের সাথে মেলে" এর একটি নৈমিত্তিক গুগল প্রকাশ করে, শীর্ষ ফলাফলের মধ্যে, "স্ট্রিম্যাচ ম্যাচস (রেজেক্স)" বাক্যাংশের মত একই ফলাফলটি পাওয়া যায় "phrase গুরুত্বপূর্ণ শব্দটি "হুবহু"।
রবিনো

উত্তর:


323

জাভা এর ভুল নাম .matches()পদ্ধতিতে স্বাগতম ... এটি সমস্ত ইনপুট চেষ্টা করে এবং মেলে। দুর্ভাগ্যক্রমে, অন্যান্য ভাষাগুলি অনুসরণ করেছে :(

আপনি যদি দেখতে চান যে রেজেক্স কোনও ইনপুট পাঠ্যের সাথে মেলে কিনা, একটি Pattern, ক Matcherএবং .find()ম্যাচারের পদ্ধতিটি ব্যবহার করুন:

Pattern p = Pattern.compile("[a-z]");
Matcher m = p.matcher(inputstring);
if (m.find())
    // match

তাহলে কি যদি আপনি চান তাহলে একটি ইনপুট শুধুমাত্র ছোট হাতের অক্ষর রয়েছে দেখতে প্রকৃতপক্ষে, আপনি ব্যবহার করতে পারেন .matches(), কিন্তু আপনি এক বা একাধিক অক্ষর মেলে প্রয়োজন: পরিশেষে যোগ একটি +আপনার চরিত্র ক্লাসের মধ্যেই হিসেবে [a-z]+। অথবা ব্যবহার ^[a-z]+$এবং .find()


2
আমি অনলাইনে অসম্পূর্ণ 100 টি টিউটোরিয়াল খুঁজে পাই। একটি ভাল খুঁজে পাওয়া যায় নি। আপনার কি কোন পরামর্শ আছে?
জন

থ্যানেক্স @fge ব্যাখ্যা করার জন্য .matches()। আপনি কি জানেন যে এই উদাহরণে.find() এত ধীরে কাজ করে কেন ?
কনস্ট্যান্টিন কনোপকো

3
অন্যান্য ভাষা অনুসরণ করা মামলাগুলির অর্থ কী ? আমি জানি থেকে, শুধুমাত্র সি ++ পদ্ধতির একটি সমতুল্য সেট আছে - regex_searchএবং regex_match। পাইথনে, re.matchস্ট্রিংয়ের শুরুতে ম্যাচটি কেবল অ্যাঙ্কর করে (যেমন এটি হয় \Apattern) এবং পাইথন 3.x একটি দুর্দান্ত .fullmatch()পদ্ধতি পেয়েছে । জেএস, গো, পিএইচপি এবং। নেটগুলিতে ম্যাচটি পুরোপুরি অ্যাঙ্কর করে এমন কোনও রেইগেক্স পদ্ধতি নেই। ইলাস্টিক অনুসন্ধান, এক্সএমএল স্কিমা এবং এইচটিএমএল 5 / ভ্যালিডেটর অ্যাংলুয়ার নিদর্শনগুলি সর্বদা ডিফল্টরূপে অ্যাঙ্কর থাকে। সুইফট / অবজেক্টিভ সি-তে, বিকল্পের সাথে শুরুতে প্যাটার্নটি অ্যাঙ্কর করার একটি উপায় রয়েছে।
উইক্টর স্ট্রিবিউ নভো

এটি করার কোনও অনলাইনার উপায় আছে কি?
কার্ডিনাল - মনিকা

44

[a-z]a এবং z এর মধ্যে একক চরের সাথে মেলে । সুতরাং, "d"উদাহরণস্বরূপ , যদি আপনার স্ট্রিংটি ঠিক থাকে , তবে এটি মিলে গেলে এবং মুদ্রিত হত।

[a-z]+এক বা একাধিক অক্ষরের সাথে মেলে তুলতে আপনাকে আপনার রেজেক্স পরিবর্তন করতে হবে।


12
অবশ্যই এটি একটি একক চরের সাথে মেলে, এটিই সেই রেজিপ্সপ! তবে যা স্পষ্ট নয় (এবং এটিও হওয়া উচিত নয়!) হ'ল জাভা প্রদত্ত রেজিএক্সএক্সের চারপাশে উপসর্গ ^এবং প্রত্যয় স্থাপন $করে, এটি অযাচিতভাবে পরিবর্তন করে এবং অদ্ভুত বাগ তৈরি করে। তাদের এটি করা উচিত নয়, কারণ এটিই ছিল না যে প্রাথমিক পুনর্নির্মাণটি কীভাবে বোঝানো হয়েছিল।
klaar

28

String.matchesপুরো স্ট্রিংটি কেবল কোনও সাবস্ট্রিং নয়, রেজেক্সের সাথে মেলে কিনা তা প্রদান করে ।


3
সত্যিই দুঃখজনক কিছু এমনটি যা আপনি ঠিক বলেছেন। আমি কেন জানি না কেন তারা এইভাবে এটি করেছে।
হোলা সোয় এদু ফেলিজ নাভিদাদ

16

জাভা বাস্তবায়নগুলি রেজিক্সগুলি পুরো স্ট্রিংয়ের সাথে মেলে চেষ্টা করে

এটি পার্ল রেজেক্সেস থেকে পৃথক, যা কোনও মিলের অংশ খুঁজে পাওয়ার চেষ্টা করে

আপনি যদি ছোট অক্ষরের ব্যতীত অন্য কোনও স্ট্রিং সন্ধান করতে চান তবে প্যাটার্নটি ব্যবহার করুন [a-z]+

যদি আপনি কমপক্ষে একটি নিম্নতর অক্ষরের একটি স্ট্রিং সন্ধান করতে চান তবে প্যাটার্নটি ব্যবহার করুন .*[a-z].*


আরো তথ্য এখানে
ycomp


12

ব্যবহৃত

String[] words = {"{apf","hum_","dkoe","12f"};
    for(String s:words)
    {
        if(s.matches("[a-z]+"))
        {
            System.out.println(s);
        }
    }

4

আমি একবার একই সমস্যার মুখোমুখি হয়েছি:

Pattern ptr = Pattern.compile("^[a-zA-Z][\\']?[a-zA-Z\\s]+$");

উপরের ব্যর্থ!

Pattern ptr = Pattern.compile("(^[a-zA-Z][\\']?[a-zA-Z\\s]+$)");

উপরোক্ত (এবং ভিতরে প্যাটার্ন সঙ্গে কাজ করে )


2

আপনার নিয়মিত প্রকাশটি [a-z]মেলে না dkoeকারণ এটি কেবল দৈর্ঘ্যের স্ট্রিংসের সাথে মেলে matches এর মতো কিছু ব্যবহার করুন [a-z]+


-1

আপনার অবশ্যই ()ম্যাচের জন্য প্যাটার্নটিতে কমপক্ষে একটি ক্যাপচার রাখতে হবে এবং সঠিক প্যাটার্নটি এভাবে লাগাতে হবে :

String[] words = {"{apf","hum_","dkoe","12f"};
for(String s:words)
{
    if(s.matches("(^[a-z]+$)"))
    {
        System.out.println(s);
    }
}

বন্ধনী কিছুই পরিবর্তন করেনি।
টৌনিউক

বন্ধনী ব্যতীত @ টনিউকের matchesকোনও আউটপুট নেই।
মোহসেনবি

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