জাভা রেজেেক্স গ্রুপ সূচকগুলি ক্যাপচার করছে


113

আমার নিচের লাইনটি আছে

typeName="ABC:xxxxx;";

আমার এই শব্দটি আনতে হবে ABC,

আমি নিম্নলিখিত কোড স্নিপেট লিখেছি,

Pattern pattern4=Pattern.compile("(.*):");
matcher=pattern4.matcher(typeName);

String nameStr="";
if(matcher.find())
{
    nameStr=matcher.group(1);

}

সুতরাং যদি আমি করা group(0)আমি পেতে ABC:কিন্তু আমি যদি করা group(1)হয় ABC, তাই আমি জানতে চাই

  1. এ কি করে 0এবং 1এর অর্থ কি? কেউ আমাকে ভাল উদাহরণ দিয়ে ব্যাখ্যা করতে পারলে আরও ভাল হবে।

  2. রেজেক্স প্যাটার্নটিতে এটি রয়েছে :, সুতরাং group(1)ফলাফল কেন বাদ দেয়? গোষ্ঠী 1 কি প্রথম বন্ধনীর ভিতরে সমস্ত শব্দ সনাক্ত করে?

  3. সুতরাং, আমি যদি আরও দুটি প্রথম বন্ধনী রাখি যেমন \\s*(\d*)(.*):: তবে, সেখানে দুটি গ্রুপ থাকবে? অংশ group(1)ফিরে এবং (\d*)অংশ group(2)ফিরে আসবে (.*)?

কোড স্নিপেটটি আমার বিভ্রান্তিগুলি পরিষ্কার করার উদ্দেশ্যে দেওয়া হয়েছিল। আমি যে কোডটি ব্যবহার করছি তা নয়। উপরে দেওয়া কোডটি String.split()আরও সহজ উপায়ে করা যেতে পারে ।

উত্তর:


182

ক্যাপচারিং এবং গ্রুপিং

ক্যাপচার গ্রুপ (pattern) একটি সৃষ্টি গ্রুপ যে হয়েছে ক্যাপচার সম্পত্তি।

এমন একটি সম্পর্কিত যা আপনি প্রায়শই দেখতে পাবেন (এবং ব্যবহার করুন) (?:pattern), যা সম্পত্তি ক্যাপচার না করেই একটি গোষ্ঠী তৈরি করে, যার ফলে নন-ক্যাপচারিং গ্রুপটির নাম দেওয়া হয়েছে

একটি গ্রুপ সাধারণত ব্যবহৃত হয় যখন আপনাকে প্যাটার্নগুলির ক্রম পুনরাবৃত্তি করতে হবে, উদাহরণস্বরূপ (\.\w+)+, বা বিকল্পটি কোথায় কার্যকর হওয়া উচিত তা নির্দিষ্টকরণের জন্য ^(0*1|1*0)$( যেমন ^, তারপরে 0*1বা 1*0, তারপরে $) বনাম ^0*1|1*0$( ^0*1বা 1*0$)।

দলবদ্ধকরণ বাদে একটি ক্যাপচারিং গোষ্ঠী ক্যাপচারিং গ্রুপের অভ্যন্তরে প্যাটার্নের সাথে মিলেছে এমন পাঠ্যও রেকর্ড করবে (pattern)। আপনার উদাহরণ ব্যবহার করে, (.*):, .*ম্যাচ ABCএবং :ম্যাচ :এবং যেহেতু .*গ্রুপ ক্যাপচার ভিতরে (.*), টেক্সট ABCক্যাপচারিং গ্রুপ 1 এর জন্য নথিভুক্ত করা হয়।

দল নম্বর

পুরো প্যাটার্নটি গ্রুপ নম্বর 0 হিসাবে সংজ্ঞায়িত করা হয়েছে।

প্যাটার্নে যে কোনও ক্যাপচারিং গোষ্ঠী ১ থেকে সূচীকরণ শুরু করে The সূচকগুলি ক্যাপচারিং গ্রুপগুলির উদ্বোধনী বন্ধনীগুলির ক্রম দ্বারা সংজ্ঞায়িত করা হয় । উদাহরণস্বরূপ, নীচের প্যাটার্নে এখানে সমস্ত 5 টি ক্যাপচারিং গ্রুপ রয়েছে:

(group)(?:non-capturing-group)(g(?:ro|u)p( (nested)inside)(another)group)(?=assertion)
|     |                       |          | |      |      ||       |     |
1-----1                       |          | 4------4      |5-------5     |
                              |          3---------------3              |
                              2-----------------------------------------2

গ্রুপ নম্বরগুলি \nপ্যাটার্নে এবং $nপ্রতিস্থাপনের স্ট্রিংয়ে ব্যাক-রেফারেন্সে ব্যবহৃত হয় ।

অন্যান্য রেগেক্স স্বাদে (পিসিআরই, পার্ল), সেগুলি সাব-রুটিন কলগুলিতেও ব্যবহৃত হতে পারে ।

আপনি নির্দিষ্ট গোষ্ঠীর সাথে মেলে এমন পাঠ্যটি অ্যাক্সেস করতে পারেন Matcher.group(int group)। গ্রুপ নম্বরগুলি উপরে বর্ণিত বিধি দ্বারা চিহ্নিত করা যেতে পারে।

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

দলের নাম

জাভা 7 থেকে, আপনি একটি নামকৃত ক্যাপচারিং গোষ্ঠীকে সংজ্ঞায়িত (?<name>pattern)করতে পারেন এবং এর সাথে মিলে যাওয়া সামগ্রীটি অ্যাক্সেস করতে পারেন Matcher.group(String name)। রেজেক্স দীর্ঘতর, তবে কোডটি আরও অর্থবহ, কারণ এটি আপনাকে বোঝায় যে রেজেক্সের সাথে কী মিলছে বা উত্তোলনের চেষ্টা করছেন।

গোষ্ঠীর নামগুলি \k<name>প্যাটার্নে এবং ${name}প্রতিস্থাপনের স্ট্রিংয়ে ব্যাক-রেফারেন্সে ব্যবহৃত হয় ।

নামযুক্ত ক্যাপচারিং গ্রুপগুলি এখনও একই নম্বর স্কিমের সাথে নম্বরযুক্ত, সুতরাং সেগুলি দিয়েও অ্যাক্সেস করা যায় Matcher.group(int group)

অভ্যন্তরীণভাবে, জাভা বাস্তবায়ন কেবল নাম থেকে গ্রুপ নম্বরে মানচিত্র। অতএব, আপনি 2 টি ভিন্ন ক্যাপচারিং গ্রুপের জন্য একই নাম ব্যবহার করতে পারবেন না।


1
কি দারুন! কীভাবে নেস্টিং গ্রুপ অর্ডার কাজ করে তা নন-ক্যাপচারিং গ্রুপগুলি ব্যাখ্যা করার জন্য @ এনহট্টহধকে ধন্যবাদ জানাই। অবশেষে আপনার ব্যাখ্যাটি না পড়া পর্যন্ত আমি কীভাবে গ্রুপ নম্বরগুলি কাজ করেছিলাম তাতে স্তম্ভিত হয়ে পড়েছিলাম। অনেক ধন্যবাদ!
এমএমএইচ

92

আমাদের বাকি জন্য

এটি কীভাবে কাজ করে তার একটি সহজ এবং স্পষ্ট উদাহরণ এখানে

Regex: ([a-zA-Z0-9]+)([\s]+)([a-zA-Z ]+)([\s]+)([0-9]+)

স্ট্রিং: "!* UserName10 John Smith 01123 *!"

group(0): UserName10 John Smith 01123
group(1): UserName10
group(2):  
group(3): John Smith
group(4):  
group(5): 01123

আপনি দেখতে পাচ্ছেন যে, আমি পাঁচটি গ্রুপ তৈরি করেছি যা প্রতিটি বন্ধনীতে আবদ্ধ।

আমি অন্তর্ভুক্ত! * এবং *! এটি পরিষ্কার করার জন্য উভয় পক্ষেই। মনে রাখবেন যে এই অক্ষরের কোনওটিই রেজিএক্সে নেই এবং ফলস্বরূপ উত্পাদিত হবে না। গোষ্ঠী (0) কেবল আপনাকে পুরো ম্যাচিং স্ট্রিং দেয় (আমার একক লাইনে অনুসন্ধানের সমস্ত মানদণ্ড)। গ্রুপ 1 প্রথম স্থানের ঠিক আগে থামে কারণ স্থানের অক্ষরটি অনুসন্ধানের মানদণ্ডে অন্তর্ভুক্ত ছিল না। গোষ্ঠী 2 এবং 4 কেবলমাত্র শ্বেত স্থান, যা এই ক্ষেত্রে আক্ষরিক অর্থে একটি স্থানের অক্ষর, তবে এটি একটি ট্যাব বা লাইন ফিডও হতে পারে 3 গোষ্ঠী 3 এ স্থান অন্তর্ভুক্ত করে কারণ আমি এটি অনুসন্ধানের মানদণ্ডে রেখেছি ... ইত্যাদি etc.

আশা করি এটি উপলব্ধিযোগ্য।


1
নিখুঁত উদাহরণ যা প্রাথমিকভাবে বুঝতে সহজ। আমার সন্দেহ আছে এটি কি পাইথনের রেগ প্রাক্তন গ্রুপিংয়ের মতো? অন্যথায় কোন পার্থক্য আছে? আমি প্রাক্তন রেজিস্ট্রেশন করতে নতুন তাই সে কারণেই আমি উভয় ভাষায় কিছুটা বিভ্রান্ত।
মণি

1
এটি কোনও বৈধ জাভা রেজেেক্স নয়: ব্যাকস্ল্যাশগুলি অবশ্যই দ্বিগুণ করতে হবে।
নিকোলাস রাউল

1
@ নিকোলাসরৌল: স্ট্রিং আক্ষরিক ক্ষেত্রে পালানোর সিনট্যাক্সের কারণে ডাবল ব্যাকস্ল্যাশ হয়। আসল রেজেক্স সিনট্যাক্স (যেমন আপনি কনসোলটিতে রেজেক্সযুক্ত স্ট্রিংটি মুদ্রণ করেন) ডাবল ব্যাকস্ল্যাশ প্রয়োজন হয় না।
nhahtdh

@ নিকোলাসআরল যদি আপনি কোনও উপযুক্ত আইডিই ব্যবহার করে আমার রেইগেক্স স্ট্রিংটিকে আসল জাভা কোডে কপি এবং পেস্ট করতে থাকেন তবে আইডিই প্রয়োজনমতো এস্কেপ স্ল্যাশগুলি সঠিকভাবে ফর্ম্যাট করবে। তবে আমার রেজেক্সটি প্রযুক্তিগতভাবে এবং সিনট্যাক্টিক্যালি সঠিক এবং এটি মূল উদ্দেশ্যটি পরিবেশন করে যা রেজেক্স কোড এবং প্রাপ্ত ফলাফলগুলির মধ্যে সংযোগ প্রদর্শন করা (খুব নির্দিষ্ট উদাহরণ ব্যবহার করে) ... কিছুটা হালকা করা ... ☺
মাইকেল সিমস

44

পেরেজেসিসগুলি ()রেজেক্স বাক্যাংশগুলির গোষ্ঠীকরণ সক্ষম করতে ব্যবহৃত হয়।

group(1)স্ট্রিং প্রথম বন্ধনী মধ্যে যে রয়েছে (.*), যাতে .*এই ক্ষেত্রে

এবং group(0)পুরো ম্যাচিং স্ট্রিং রয়েছে।

আপনার যদি আরও গোষ্ঠী থাকে (পড়ুন (...)) তবে এটি পরবর্তী সূচীগুলি (2, 3 এবং আরও) সহ গ্রুপগুলিতে স্থাপন করা হবে।


2
সুতরাং, আমি সঠিক যে প্রথম বন্ধন যুক্ত গ্রুপ তৈরি করার জন্য?
পি বাসাক

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