আমি কীভাবে একটি রেইজেক্সের জন্য ম্যাচের সংখ্যা গণনা করতে পারি?


99

ধরা যাক আমার কাছে একটি স্ট্রিং রয়েছে যা এতে রয়েছে:

HelloxxxHelloxxxHello

'হ্যালো' সন্ধানের জন্য আমি একটি প্যাটার্নটি সংকলন করি

Pattern pattern = Pattern.compile("Hello");
Matcher matcher = pattern.matcher("HelloxxxHelloxxxHello");

এটি তিনটি ম্যাচ খুঁজে পাওয়া উচিত। আমি কয়টি ম্যাচ ছিল তার একটি গণনা পেতে পারি?

আমি বিভিন্ন লুপগুলি ব্যবহার করে দেখেছি matcher.groupCount()কিন্তু এটি কার্যকর হয়নি।


আপনার অনুসন্ধান-স্ট্রিংয়ের ইনপুট স্ট্রিংয়ে ওভারল্যাপিংয়ের কোনও সুযোগ থাকতে পারে?
আইয়ুব

উত্তর:


178

matcher.find()সমস্ত ম্যাচ সন্ধান করে না , কেবল পরের ম্যাচ।

জাভা 9+ এর সমাধান

long matches = matcher.results().count();

জাভা 8 এবং এর চেয়ে বেশি বয়সীদের জন্য সমাধান

আপনাকে নিম্নলিখিতগুলি করতে হবে। ( জাভা 9 থেকে শুরু করে, একটি দুর্দান্ত সমাধান রয়েছে )

int count = 0;
while (matcher.find())
    count++;

বিটিডব্লিউ, matcher.groupCount()সম্পূর্ণ ভিন্ন কিছু।

সম্পূর্ণ উদাহরণ :

import java.util.regex.*;

class Test {
    public static void main(String[] args) {
        String hello = "HelloxxxHelloxxxHello";
        Pattern pattern = Pattern.compile("Hello");
        Matcher matcher = pattern.matcher(hello);

        int count = 0;
        while (matcher.find())
            count++;

        System.out.println(count);    // prints 3
    }
}

ওভারল্যাপিং ম্যাচগুলি পরিচালনা করছে

যখন ম্যাচ বেড়ে চলেছে aaমধ্যে aaaaউপরে স্নিপেট দিতে হবে 2

aaaa
aa
  aa

3 টি ম্যাচ পেতে, যেমন এই আচরণ:

aaaa
aa
 aa
  aa

আপনাকে সূচীতে একটি ম্যাচের জন্য নিম্নলিখিতটি অনুসন্ধান করতে হবে <start of last match> + 1:

String hello = "aaaa";
Pattern pattern = Pattern.compile("aa");
Matcher matcher = pattern.matcher(hello);

int count = 0;
int i = 0;
while (matcher.find(i)) {
    count++;
    i = matcher.start() + 1;
}

System.out.println(count);    // prints 3

স্ট্রিংয়ের মধ্যে উপস্থিত ম্যাচের সংখ্যা গণনা করা হচ্ছে। Java.util.regex.Matcher.region (int start, int end) পদ্ধতি এই ম্যাচারের অঞ্চলের সীমা নির্ধারণ করে। অঞ্চলটি ইনপুট ক্রমের অংশ যা কোনও মিল খুঁজে পেতে অনুসন্ধান করা হবে। এই পদ্ধতিটি চালানো ম্যাচারটিকে পুনরায় সেট করে এবং তারপরে অঞ্চলটিকে সূচনা পরামিতি দ্বারা সূচিত সূচনাতে শুরু করতে এবং শেষ প্যারামিটার দ্বারা নির্দিষ্ট সূচকটিতে শেষ করতে সেট করে। এটা চেষ্টা কর. while(matcher.find()){ matcher.region(matcher.end()-1, str.length()); count++; }
মুকেশ কুমার গুপ্ত 11

17

এটি ওভারল্যাপ হতে পারে এমন ম্যাচগুলির জন্য কাজ করা উচিত:

public static void main(String[] args) {
    String input = "aaaaaaaa";
    String regex = "aa";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(input);
    int from = 0;
    int count = 0;
    while(matcher.find(from)) {
        count++;
        from = matcher.start() + 1;
    }
    System.out.println(count);
}


3

আপনি যদি জাভা 8 টি স্ট্রিম ব্যবহার করতে চান এবং whileলুপগুলিতে অ্যালার্জি পান তবে আপনি এটি চেষ্টা করতে পারেন:

public static int countPattern(String references, Pattern referencePattern) {
    Matcher matcher = referencePattern.matcher(references);
    return Stream.iterate(0, i -> i + 1)
            .filter(i -> !matcher.find())
            .findFirst()
            .get();
}

দাবি অস্বীকার: এটি কেবল বিযুক্ত ম্যাচের জন্য কাজ করে।

উদাহরণ:

public static void main(String[] args) throws ParseException {
    Pattern referencePattern = Pattern.compile("PASSENGER:\\d+");
    System.out.println(countPattern("[ \"PASSENGER:1\", \"PASSENGER:2\", \"AIR:1\", \"AIR:2\", \"FOP:2\" ]", referencePattern));
    System.out.println(countPattern("[ \"AIR:1\", \"AIR:2\", \"FOP:2\" ]", referencePattern));
    System.out.println(countPattern("[ \"AIR:1\", \"AIR:2\", \"FOP:2\", \"PASSENGER:1\" ]", referencePattern));
    System.out.println(countPattern("[  ]", referencePattern));
}

এটি মুদ্রণ করে:

2
0
1
0

এটি স্ট্রিমগুলির সাথে বিচ্ছিন্ন ম্যাচের জন্য একটি সমাধান:

public static int countPattern(String references, Pattern referencePattern) {
    return StreamSupport.stream(Spliterators.spliteratorUnknownSize(
            new Iterator<Integer>() {
                Matcher matcher = referencePattern.matcher(references);
                int from = 0;

                @Override
                public boolean hasNext() {
                    return matcher.find(from);
                }

                @Override
                public Integer next() {
                    from = matcher.start() + 1;
                    return 1;
                }
            },
            Spliterator.IMMUTABLE), false).reduce(0, (a, c) -> a + c);
}

1

রেজেক্স আপনার ইনপুটটিতে পাওয়া মিলগুলির সংখ্যা গণনা করতে নীচের কোডটি ব্যবহার করুন

        Pattern p = Pattern.compile(regex, Pattern.MULTILINE | Pattern.DOTALL);// "regex" here indicates your predefined regex.
        Matcher m = p.matcher(pattern); // "pattern" indicates your string to match the pattern against with
        boolean b = m.matches();
        if(b)
        count++;
        while (m.find())
        count++;

এটি একটি সাধারণ কোড যা নির্দিষ্ট কোনও নির্দিষ্ট নয় যদিও এটি আপনার প্রয়োজন অনুসারে উপযুক্ত করুন

কোনও ভুল হলে দয়া করে আমাকে সংশোধন করতে দ্বিধা বোধ করবেন।

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