জাভেতে রেজেেক্স নামী গোষ্ঠীগুলি


173

java.regexপ্যাকেজটির নামযুক্ত গোষ্ঠীগুলির জন্য সমর্থন নেই তা আমার বোঝার ( http://www.regular-expressions.info/name.html ) তাই কেউ আমাকে তৃতীয় পক্ষের লাইব্রেরির দিকে নির্দেশ করতে পারে যা করে?

আমি জেরেগেক্সে দেখেছি তবে এর শেষ প্রকাশটি ২০০২ সালে হয়েছিল এবং এটি জাভা ৫ এর অধীনে আমার পক্ষে স্বীকার হয়নি (অবশ্যই আমি কেবল সংক্ষেপে চেষ্টা করেছি) tried


3
আপনার বোঝাপড়া ভুল is জেডি কে 7 নামক দলগুলি পরিচালনা করে।
tchrist

2
@ ট্রিচ্রিস্ট ২০০৯ সালে জেডিকে K ছিল না।
Alex78191

উত্তর:


275

( আপডেট : আগস্ট ২০১১ )

জিওফ্লেইন তার উত্তরে যেমন উল্লেখ করেছে , জাভা 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;
                }

উপরের দুটি লিঙ্ক ভেঙে গেছে বলে মনে হচ্ছে?
জোনাস

এই কোডটি বগি। এটি ASCII সনাক্তকারীদের সন্ধান করছে। ওইটা ভুল. এটি জাভা যে কোনও সনাক্তকারীতে অনুমতি দেয় এমন কোনও কিছুর সন্ধান করা উচিত !!
tchrist

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

@ ক্রিশ্চ: এই নির্ভুলতার জন্য আপনাকে ধন্যবাদ (অন্তর্ভুক্ত)। আমি "জাভা রেইজেক্স সহায়ক" (উত্সাহিত) এর আপনার উত্তরের উত্তরটিতে একটি লিঙ্কও যুক্ত করেছি।
ভনসি

জাভাতে ম্যাচার অবজেক্টের জন্য কোনও ম্যাচার.নেম (ইনটেক্স ইনডেক্স) পদ্ধতি নেই ??
ot0


27

হ্যাঁ তবে এর অদৃশ্য সূর্য ক্লাসগুলি হ্যাক করছে। একটি সহজ উপায় আছে:

http://code.google.com/p/named-regexp/

নেট-রেজিএক্সপ্যাক্স স্ট্যান্ডার্ড জেডিকে নিয়মিত এক্সপ্রেশন বাস্তবায়নের জন্য একটি পাতলা মোড়ক, যার নাম নেট ক্যাপচারিং গ্রুপগুলি হ্যান্ডেল করার একক উদ্দেশ্য। নেট স্টাইল: (? ...)।

এটি জাভা 5 এবং 6 এর সাথে ব্যবহার করা যেতে পারে (জেনেরিকগুলি ব্যবহৃত হয়)।

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


1
খুব খারাপভাবে এই ক্যানডটি জিডাব্লুটিটির মধ্যে থেকে ব্যবহার করা যেতে পারে।
সাকুরবা

4
এই প্রকল্পের গিটহাব কাঁটাচামড়া পরীক্ষা করে দেখুন , যা মূল থেকে বেশ কয়েকটি বাগগুলি স্থির করে। এটি মেভেন সেন্ট্রালেও হোস্ট করা হয়েছে।
টনি 19

1
আমার ক্ষেত্রে কেবল একটি সতর্কতার কথা, গিথুবের টনি 19 কাঁটাচামচটি 0.1.8 হিসাবে অ্যান্ড্রয়েডে কাজ করে না।
চক ডি

2
@ রবারম্যাললেট, অ্যান্ড্রয়েড-নির্দিষ্ট সমস্যাটি এখন ঠিক করা হয়েছে এবং এটি 0.1.9 এ হবে।
টনি 19

2

জেজেেক্স দিয়ে আপনি কী ধরণের সমস্যা পান ? এটি জাভা 5 এবং জাভা 6 এর অধীনে আমার পক্ষে ভাল কাজ করেছে।

জেজেেক্স কাজটি ভালভাবে করে (যদিও শেষ সংস্করণটি 2002 থেকে হয়), আপনি জাভাএসই 7 এর জন্য অপেক্ষা করতে না চাইলে


2

প্রাক java7 চলমান তাদের জন্য নাম গ্রুপ দ্বারা সমর্থিত Joni (জাভা বন্দর Oniguruma regexp গ্রন্থাগার)। ডকুমেন্টেশন অপ্রয়োজনীয়, তবে এটি আমাদের পক্ষে ভালভাবে কাজ করেছে।
বাইনারিগুলি মাভেনের মাধ্যমে উপলব্ধ ( http://repository.codehaus.org/org/jruby/joni/joni/ )।


আমি উপরোক্ত রায়ান দ্বারা উল্লিখিত জনি বিকল্পটিতে খুব আগ্রহী - নামকৃত ক্যাপচার গ্রুপগুলি ব্যবহার করে আপনার কাছে কোনও কোড স্নিপেট রয়েছে - আমি বেসিক ম্যাচিং এবং সঠিকভাবে কাজ করতে সন্ধান করতে সক্ষম হয়েছি - তবে আমি কোন পদ্ধতিটি ব্যবহার করব তা আমি দেখতে পাচ্ছি না গোষ্ঠীর নামগুলিতে অ্যাক্সেস পান বা গ্রুপ নাম ব্যবহার করে ক্যাপচারের মান পেতে পারেন get
mamsmith

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