( আপডেট : আগস্ট ২০১১ )
জিওফ্লেইন তার উত্তরে যেমন উল্লেখ করেছে , জাভা 7 এখন নামী দলগুলিকে সমর্থন করে ।
tchrist মন্তব্য সীমিত যে সমর্থন সীমাবদ্ধ।
তিনি তার দুর্দান্ত উত্তরে " জাভা রেজেক্স সহায়ক " তে সীমাবদ্ধতার বিবরণ দেন
জাভা 7 রেগেক্স নামের গ্রুপ সমর্থনটি সেপ্টেম্বর 2010 এ ওরাকেলের ব্লগে উপস্থাপিত হয়েছিল ।
জাভা 7 এর আনুষ্ঠানিক প্রকাশে, নামকৃত ক্যাপচারিং গ্রুপকে সমর্থন করার জন্য নির্মাণগুলি হ'ল:
(?<name>capturing text)
একটি নামী গোষ্ঠী "নাম" সংজ্ঞায়িত করতে
\k<name>
একটি নামী গোষ্ঠী "নাম" backreferences করতে
${name}
ম্যাচারের রিপ্লেসমেন্ট স্ট্রিংয়ে ক্যাপচার করা গোষ্ঠীর বিষয়ে উল্লেখ করুন
Matcher.group(String name)
প্রদত্ত "নামী গোষ্ঠী" দ্বারা ক্যাপচার ইনপুট উপসর্গটি ফিরিয়ে দিতে।
প্রাক জাভা 7 এর অন্যান্য বিকল্পগুলি হ'ল :
( আসল উত্তর : জানুয়ারী 2009 , পরবর্তী দুটি লিঙ্ক এখন ভাঙা হয়েছে)
আপনি নামী গোষ্ঠীটিকে উল্লেখ করতে পারবেন না, যদি না আপনি নিজের নিজের সংস্করণটি রেজিএক্স কোড করেন ...
যে অবিকল কি Gorbush2 এই থ্রেড করেনি ।
Regex2
(সীমাবদ্ধ বাস্তবায়ন, যেমন tchrist দ্বারা আবার চিহ্নিত করা হয়েছে , কারণ এটি কেবল ASCII শনাক্তকারীদের জন্য দেখায় lim
কেবলমাত্র একই নামে একটি নামী গোষ্ঠী রাখতে সক্ষম (যা আপনার উপর সর্বদা নিয়ন্ত্রণ থাকে না!) এবং সেগুলি ইন-রেজেক্স পুনরাবৃত্তির জন্য ব্যবহার করতে সক্ষম না হচ্ছেন।
দ্রষ্টব্য: আপনি পার্ল এবং পিসিআরই রেজিজেসগুলিতে সত্যিকারের রেগেক্স পুনরাবৃত্তি উদাহরণগুলি সন্ধান করতে পারেন, যেমন রেজিপ্যাক্স পাওয়ার , পিসিআরআই স্পেস এবং ভারসাম্য প্যারেন্টিসেস স্লাইডের সাথে ম্যাচিং স্ট্রিংগুলিতে উল্লিখিত হয়েছে )
উদাহরণ:
স্ট্রিং:
"TEST 123"
RegExp:
"(?<login>\\w+) (?<id>\\d+)"
প্রবেশ
matcher.group(1) ==> TEST
matcher.group("login") ==> TEST
matcher.name(1) ==> login
প্রতিস্থাপন করা
matcher.replaceAll("aaaaa_$1_sssss_$2____") ==> aaaaa_TEST_sssss_123____
matcher.replaceAll("aaaaa_${login}_sssss_${id}____") ==> aaaaa_TEST_sssss_123____
(বাস্তবায়ন থেকে নিষ্কাশন)
public final class Pattern
implements java.io.Serializable
{
[...]
/**
* Parses a group and returns the head node of a set of nodes that process
* the group. Sometimes a double return system is used where the tail is
* returned in root.
*/
private Node group0() {
boolean capturingGroup = false;
Node head = null;
Node tail = null;
int save = flags;
root = null;
int ch = next();
if (ch == '?') {
ch = skip();
switch (ch) {
case '<': // (?<xxx) look behind or group name
ch = read();
int start = cursor;
[...]
// test forGroupName
int startChar = ch;
while(ASCII.isWord(ch) && ch != '>') ch=read();
if(ch == '>'){
// valid group name
int len = cursor-start;
int[] newtemp = new int[2*(len) + 2];
//System.arraycopy(temp, start, newtemp, 0, len);
StringBuilder name = new StringBuilder();
for(int i = start; i< cursor; i++){
name.append((char)temp[i-1]);
}
// create Named group
head = createGroup(false);
((GroupTail)root).name = name.toString();
capturingGroup = true;
tail = root;
head.next = expr(tail);
break;
}