জাভাতে স্ট্রিং.কন্টেইনস () পদ্ধতিতে রিজেক্স কীভাবে ব্যবহার করবেন


112

আমি দেখতে চাই যে কোনও স্ট্রিংয়ের মধ্যে "স্টোর", "স্টোর", এবং "পণ্য" শব্দটি সেই ক্রমে রয়েছে কিনা তা তাদের মধ্যে যেই হোক না কেন।

আমি ব্যবহার করার চেষ্টা করেছি someString.contains(stores%store%product);এবং এছাড়াও.contains("stores%store%product");

আমার কি স্পষ্টভাবে একটি রেজেক্স ঘোষণা করার এবং পদ্ধতিতে পাস করার দরকার আছে বা আমি কোনও রেইজেক্স পাস করতে পারি না?

উত্তর:


125

String.contains

String.containsস্ট্রিং, পিরিয়ডের সাথে কাজ করে। এটি রেজেক্সের সাথে কাজ করে না। এটি নির্দিষ্ট স্ট্রিং বর্তমান স্ট্রিংয়ে প্রদর্শিত হবে কিনা তা যাচাই করবে।

নোট যে String.containsশব্দের সীমা পরীক্ষা করে না; এটি কেবল সাবস্ট্রিংয়ের জন্য পরীক্ষা করে।

রেজেক্স সমাধান

রেগেক্স এর চেয়ে বেশি শক্তিশালী String.contains, যেহেতু আপনি কীওয়ার্ডগুলিতে শব্দের সীমানা (অন্যান্য জিনিসগুলির মধ্যে) প্রয়োগ করতে পারেন। এর অর্থ আপনি কেবল সাবস্ট্রিংয়ের পরিবর্তে কীওয়ার্ডগুলিকে শব্দ হিসাবে সন্ধান করতে পারেন ।

String.matchesনিম্নলিখিত রেজেক্স সহ ব্যবহার করুন :

"(?s).*\\bstores\\b.*\\bstore\\b.*\\bproduct\\b.*"

RAW regex (স্ট্রিং আক্ষরিক অর্থে পালানো সরিয়ে ফেলুন - আপনি উপরের স্ট্রিংটি মুদ্রণ করলে আপনি এটি পাবেন):

(?s).*\bstores\b.*\bstore\b.*\bproduct\b.*

\bশব্দ সীমানা জন্য চেক, যাতে আপনার জন্য একটি ম্যাচ পাবেন না restores store products। নোটটিও stores 3store_productপ্রত্যাখ্যান করা হয়েছে, যেহেতু অঙ্ক এবং _এটি একটি শব্দের অংশ হিসাবে বিবেচিত হয়, তবে আমি সন্দেহ করি যে এই মামলাটি প্রাকৃতিক পাঠ্যে উপস্থিত রয়েছে।

যেহেতু উভয় পক্ষের জন্য শব্দের সীমানা পরীক্ষা করা হয়েছে, উপরের রেজেক্স সঠিক শব্দগুলির জন্য অনুসন্ধান করবে। অন্য কথায়, stores stores productউপরের রেজেক্সের সাথে মেলে না, যেহেতু আপনি শব্দটি storeছাড়া সন্ধান করছেন s

.সাধারণত অনেকগুলি নতুন লাইনের অক্ষর ব্যতীত যে কোনও অক্ষরের সাথে মিল থাকে । শুরুতে ব্যতিক্রম ছাড়াই কোনও চরিত্রের সাথে মেলে তোলে (এটি নির্দেশ করার জন্য টিম পিটজ্যাকারকে ধন্যবাদ)।(?s).


7
(?s)স্ট্রিংয়ে নতুন লাইন রয়েছে সে ক্ষেত্রে আপনি আপনার রেজেক্সের শুরুতে যুক্ত করতে চাইতে পারেন ।
টিম পিটজ্যাকার

আমি এটি এর মতো একটি ইউআরএলে এটি পরীক্ষা করে দেখছি
vipin8169

আপনি এখানে প্রথম ব্যাকস্ল্যাশ ব্যাখ্যা করতে পারেন\\b
vipin8169

1
@ vipin8169: স্ট্রিংয়ে, আপনাকে \একটি একক নির্দিষ্ট করতে দ্বিগুণ করতে হবে \, সুতরাং RAW রেজেজেলে যেমন দেখা \\bযাবে তেমনি ব্যাখ্যা করা হবে \b\bউপরে বর্ণিত শব্দের সীমানা মেলে।
nhahtdh

যদি ".mydomain" মেলানোর দরকার হয়। স্ট্রিং মধ্যে। তারপরে এটি কীভাবে রেজেক্সকে আপডেট করবে। আমার ব্যবহারের ক্ষেত্রে হ'ল "www.abc.mydomain.in.io" .mydomain রয়েছে কিনা। বা না
মনমোহন সোনি

111

matcher.find()আপনার যা প্রয়োজন তা করে উদাহরণ:

Pattern.compile("stores.*store.*product").matcher(someString).find();

4
এটা ভালোবাস. আমি ম্যাচারের রেজেেক্সকে অত্যধিক জটিল বলে মনে করি।
ম্যাথার

21

আপনি কেবল matchesস্ট্রিং ক্লাসের পদ্ধতি ব্যবহার করতে পারেন ।

boolean result = someString.matches("stores.*store.*product.*");

14
আপনাকে দিয়ে শুরু .*করতে হবে বা এটি দিয়ে শুরু হওয়া স্ট্রিংগুলি কেবল মিলবে stores
shmosel

প্যাটার্নের বিপরীতে পুরো অঞ্চলটি মেলানোর চেষ্টা। মনে হচ্ছে @ শ্মোসেল ঠিক আছে, না?
পিটার ডি বি

1
ঠিক আছে, এটি কেবল মিলছে তবে স্ট্রিংটিতে কোনও অবস্থানে প্যাটার্ন রয়েছে কিনা তা পরীক্ষা করে না। এটি ওপি যা সন্ধান করে তা সমাধান নয়, আমি রেজিএক্সএক্সকে আরও পরিমার্জন করার পরামর্শ দিই।
জি বি বি

2

যদি আপনি পরীক্ষা করতে চান যে স্ট্রিংটিতে সাবস্ট্রিং রয়েছে কিনা বা রেজেক্স না ব্যবহার করছে, আপনি সবচেয়ে কাছের যা করতে পারেন তা হ'ল ফাইন্ড () ব্যবহার করে -

    private static final validPattern =   "\\bstores\\b.*\\bstore\\b.*\\bproduct\\b"
    Pattern pattern = Pattern.compile(validPattern);
    Matcher matcher = pattern.matcher(inputString);
    System.out.print(matcher.find()); // should print true or false.

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


2
public static void main(String[] args) {
    String test = "something hear - to - find some to or tows";
    System.out.println("1.result: " + contains("- to -( \\w+) som", test, null));
    System.out.println("2.result: " + contains("- to -( \\w+) som", test, 5));
}
static boolean contains(String pattern, String text, Integer fromIndex){
    if(fromIndex != null && fromIndex < text.length())
        return Pattern.compile(pattern).matcher(text).find();

    return Pattern.compile(pattern).matcher(text).find();
}

1. ফলাফল: সত্য

2. ফলাফল: সত্য


fromIndexউপেক্ষা করা হয়, তাই না? contains("something", test, 5) => true
পি কেইডেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.