জাভা রেজেক্স ক্যাপচারিং গ্রুপ


170

আমি এই কোড ব্লকটি বোঝার চেষ্টা করছি। প্রথমটিতে, আমরা এটি প্রকাশের জন্য কী খুঁজছি?

আমার বোধগম্যতা হল এটি কোনও অক্ষর (0 বা তার বেশি বার *) এর পরে 0 এবং 9 (এক বা একাধিক বার +) এর পরে যে কোনও অক্ষর (0 বা তার বেশি বার *) হয়।

এটি কার্যকর করা হলে ফলাফলটি হয়:

Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0

কেউ দয়া করে আমার সাথে যেতে পারেন?

গ্রুপগুলি ক্যাপচার করার সুবিধা কী?

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTut3 {

    public static void main(String args[]) {
        String line = "This order was placed for QT3000! OK?"; 
        String pattern = "(.*)(\\d+)(.*)";

        // Create a Pattern object
        Pattern r = Pattern.compile(pattern);

        // Now create matcher object.
        Matcher m = r.matcher(line);

        if (m.find()) {
            System.out.println("Found value: " + m.group(0));
            System.out.println("Found value: " + m.group(1));
            System.out.println("Found value: " + m.group(2));
        } else {
            System.out.println("NO MATCH");
        }
    }

}

1
একটি নতুন লাইন সন্নিবেশ করানোর জন্য, লাইনের শেষে 2 স্পেস রাখুন। Markdown সিনট্যাক্স বিষয়ে আরও: en.wikipedia.org/wiki/Markdown - আরও দেখুন: stackoverflow.com/editing-help
assylias

উত্তর:


248

আপনার যে সমস্যাটি হচ্ছে তা হ'ল পরিমাণের পরিমাণের সাথে। আপনি একটি ব্যবহার করছেন লোভী আপনার প্রথম দলের কোয়ান্টিফায়ার (INDEX 1 - সূচক 0 পুরো প্রতিনিধিত্ব করে Pattern), যেমন (এবং যেহেতু এটা করতে পারে মানে যতটা মেলে করব কোন চরিত্র, এটি মেলে করব অনেক অক্ষর হিসাবে যেমন আছে পরবর্তী গ্রুপগুলির শর্ত পূরণ করার জন্য)।

সংক্ষেপে, আপনার প্রথম গ্রুপ .*যতক্ষণ না পরের গ্রুপের সাথে কোনও \\d+কিছু মিলিয়ে ফেলতে পারে (এই ক্ষেত্রে, শেষ অঙ্ক) anything

তৃতীয় গোষ্ঠী অনুসারে এটি শেষ অঙ্কের পরে কিছু মিলবে।

যদি আপনি এটিকে আপনার প্রথম গ্রুপে অনিচ্ছুক কোয়ান্টিফায়ার হিসাবে পরিবর্তন করেন তবে আপনি মনে করেন যে ফলাফলটি আপনি প্রত্যাশা করছেন, অর্থাৎ 3000 অংশ।

1 ম গ্রুপে প্রশ্ন চিহ্ন নোট করুন ।

String line = "This order was placed for QT3000! OK?";
Pattern pattern = Pattern.compile("(.*?)(\\d+)(.*)");
Matcher matcher = pattern.matcher(line);
while (matcher.find()) {
    System.out.println("group 1: " + matcher.group(1));
    System.out.println("group 2: " + matcher.group(2));
    System.out.println("group 3: " + matcher.group(3));
}

আউটপুট:

group 1: This order was placed for QT
group 2: 3000
group 3: ! OK?

জাভা সম্পর্কে আরও তথ্য Pattern এখানে

অবশেষে, ক্যাপচারিং গোষ্ঠীগুলি বৃত্তাকার বন্ধনী দ্বারা সীমিত করা হয় এবং একবার আপনার Patternইনপুটটির সাথে মিলে গেলে, ব্যাক-রেফারেন্সগুলি (অন্যান্য জিনিসগুলির মধ্যে) ব্যবহারের জন্য খুব দরকারী উপায় সরবরাহ করে ।

জাভাতে 6 টি গোষ্ঠীগুলি কেবল তাদের আদেশের দ্বারা রেফারেন্স করা যায় (নেস্টেড গ্রুপগুলি এবং অর্ডার করার সূক্ষ্মতা থেকে সাবধান থাকুন)।

জাভা 7 এ এটি অনেক সহজ, আপনি নামযুক্ত গোষ্ঠীগুলি ব্যবহার করতে পারেন।


ধন্যবাদ! গোষ্ঠীটি কি 0 টি সঞ্চিত কারণ পুরো লাইনটি লোভী কোয়ান্টিফায়ার দ্বারা গ্রাস করা হয়েছিল যা এক বা একাধিক সংখ্যার সংস্পর্শে না আসা পর্যন্ত ব্যাকআপ হয়েছিল। 0 এটি সন্তুষ্ট তাই অভিব্যক্তি সফল। আমি তৃতীয় গোষ্ঠীটিকে বিভ্রান্তরূপে খুঁজে পেয়েছি, সেই লোভী কোয়ান্টিফায়ারও কি পুরো লাইনটি গ্রাস করে, তবে যতক্ষণ না এটি এক বা একাধিক সংখ্যার (\\ d +) সন্ধান করে ততক্ষণ পিছিয়ে যায়?
Xivilai

@ সিভিলাই আমাকে আমার উত্তরে আমার ব্যাখ্যাটি ঠিকঠাক করে ফেলুন, মাত্র এক সেকেন্ড।
মেনা

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

কম-বেশি এটি সর্বদা বাম থেকে শুরু হয় যদিও এই ক্ষেত্রে। কোয়ান্টিফায়ার সম্পর্কে আরও কিছু তথ্য এখানে
মেনা

2
আপনি জাভা 5/6 এর সাথে নামের ক্যাপচার গ্রুপগুলি ব্যবহার করতে পারেন named-regexp

16

এটি সম্পূর্ণ ঠিক আছে।

  1. প্রথম গোষ্ঠী ( m.group(0)) সর্বদা আপনার নিয়মিত অভিব্যক্তি দ্বারা আচ্ছাদিত পুরো অঞ্চলটি ক্যাপচার করে । এই ক্ষেত্রে, এটি পুরো স্ট্রিং।
  2. নিয়মিত প্রকাশগুলি ডিফল্টরূপে লোভী, যার অর্থ প্রথম গ্রুপটি রেজেক্সকে লঙ্ঘন না করে যথাসম্ভব ক্যাপচার করে। (.*)(\\d+)(আপনার Regex প্রথম অংশ) জুড়ে ...QT300int- এ প্রথম গ্রুপ এবং 0দ্বিতীয়।
  3. প্রথম দলটিকে অ-লোভী করে আপনি দ্রুত এটিকে ঠিক করতে পারেন: এতে পরিবর্তন (.*)করুন (.*?)

লোভী বনাম অলস বিষয়ে আরও তথ্যের জন্য, এই সাইটটি দেখুন।


4

ডক থেকে:

Capturing groups</a> are indexed from left
 * to right, starting at one.  Group zero denotes the entire pattern, so
 * the expression m.group(0) is equivalent to m.group().

সুতরাং গ্রুপ 0 ক্যাপচার পুরো লাইন প্রেরণ।


3

আপনার বোঝাপড়াটি সঠিক। তবে, যদি আমরা এর মধ্যে দিয়ে চলি:

  • (.*) পুরো স্ট্রিং গ্রাস করবে;
  • এটি চরিত্রগুলি ফিরিয়ে দিতে হবে যাতে এটি সন্তুষ্ট (\\d+)হয় (যার কারণে 0এটি ধরা পড়ে, এবং না 3000);
  • শেষ (.*)তারপর বাকিদের ক্যাপচার করবে।

তবে আমি নিশ্চিত নই যে লেখকের মূল উদ্দেশ্যটি কী ছিল।

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