জাভা নিয়মিত প্রকাশে in w এবং \ b এর জন্য ইউনিকোড সমতুল্য?


126

অনেকগুলি আধুনিক রেজেক্স বাস্তবায়ন \wঅক্ষর শ্রেণীর শর্টহ্যান্ডকে "কোনও বর্ণ, অঙ্ক, বা সংযোগ বিরামচিহ্ন" হিসাবে ব্যাখ্যা করে (সাধারণত: আন্ডারস্কোর)। এই ভাবে, মত একটি Regex \w+ম্যাচ শব্দ পছন্দ hello, élève, GOÄ_432বা gefräßig

দুর্ভাগ্যক্রমে, জাভা হয় না। জাভাতে, \wসীমাবদ্ধ [A-Za-z0-9_]। এটি অন্যান্য সমস্যার মধ্যেও উপরে বর্ণিত শব্দগুলির মতো মিলে যাওয়া শব্দগুলিকে শক্ত করে তোলে।

এটিও উপস্থিত হয় যে \bবিভাজক শব্দটি সেই জায়গাগুলিতে মেলে যেখানে এটি হওয়া উচিত নয়।

.NET- জাতীয়, ইউনিকোড-সচেতন \wবা \bজাভা -র সঠিক সমতুল্য কী হবে ? ইউনিকোড-সচেতন করতে অন্য কোন শর্টকাটের "পুনর্লিখন" দরকার?


3
টিম, ছোট গল্পটি হ'ল ইউনিকোডের সাথে মিল রেখে তাদের সবার লেখার দরকার। আমি এখনও জাভা 1.7 ইউনিকোড বৈশিষ্ট্যগুলির সাথে স্ক্রিপ্টগুলির জন্য শেষ পর্যন্ত সমর্থন যোগ করার চেয়ে আরও কিছু করবে বলে কোন চিহ্ন দেখতে পাচ্ছি না । এমন কিছু জিনিস রয়েছে যা আপনি ইউনিকোড বৈশিষ্ট্যের সম্পূর্ণ পরিপূরকটিতে আরও ভাল অ্যাক্সেস না করে করতে পারবেন না। আপনার কাছে এখনও যদি আমার ইউনিটপ্রোপ এবং ইউনিকারস স্ক্রিপ্টগুলি না থাকে (এবং আনমনেস ) না থাকে তবে তারা এই সমস্ত কিছুতে চক্ষু খোলার।
tchrist

কেউ শব্দ শ্রেণিতে চিহ্ন যুক্ত বিবেচনা করতে পারে। উদাহরণস্বরূপ & auml; ইউনিকোডে \ u0061। u0308 বা \ u00E4 হিসাবে প্রতিনিধিত্ব করা যেতে পারে।
মোস্তোস্কি

3
আরে টিম, আমার আপডেট দেখুন। এটি সমস্ত কাজ করার জন্য তারা একটি পতাকা যুক্ত করেছে। Hurray থেকে!
tchrist

উত্তর:


240

সোর্স কোড

আমি নীচে আলোচনা করে পুনরায় লেখার ফাংশনগুলির উত্স কোডটি এখানে উপলভ্য

জাভা 7 এ আপডেট

Patternজেডিকে for এর জন্য সনের আপডেট হওয়া ক্লাসে একটি দুর্দান্ত নতুন পতাকা রয়েছে UNICODE_CHARACTER_CLASS, যা সবকিছু ঠিকঠাক করে তোলে। এটি (?U)প্যাটার্নের অভ্যন্তরের জন্য এম্বেডেবল হিসাবে উপলব্ধ , তাই আপনি এটি Stringক্লাসের মোড়ক দিয়েও ব্যবহার করতে পারেন । এটি স্পোর্টসও অন্যান্য বিভিন্ন বৈশিষ্ট্যের সংশোধন সংজ্ঞা দেয়। এটি এখন ইউটিএস # 18 থেকে আরএল 1.2 এবং আরএল 1.2 উভয় ক্ষেত্রেই ইউনিকোড স্ট্যান্ডার্ডকে অনুসরণ করে : ইউনিকোড নিয়মিত অভিব্যক্তি । এটি একটি উত্তেজনাপূর্ণ এবং নাটকীয় উন্নতি, এবং উন্নয়ন দলকে এই গুরুত্বপূর্ণ প্রচেষ্টাটির জন্য প্রশংসা করা উচিত।


জাভার রেজেক্স ইউনিকোড সমস্যা

অর্থ - জাভা regexes সঙ্গে সমস্যা হল পার্ল 1.0 charclass বেরিয়ে হয় \w, \b, \s, \dএবং তাদের সম্পূরক সমূহ - জাভা ইউনিকোড এর সাথে কাজ করা বাড়ানো নয়। এই মধ্যে একা একা, \bনির্দিষ্ট বর্ধিত শব্দার্থবিদ্যা ভোগ, কিন্তু এই মানচিত্র তন্ন তন্ন করতে \w, কিংবা করতে ইউনিকোড শনাক্তকারী , কিংবা করতে ইউনিকোড লাইন বিরতি বৈশিষ্ট্য

অতিরিক্তভাবে, জাভাতে থাকা পসিক্স বৈশিষ্ট্যগুলি এইভাবে অ্যাক্সেস করা হয়েছে:

POSIX syntax    Java syntax

[[:Lower:]]     \p{Lower}
[[:Upper:]]     \p{Upper}
[[:ASCII:]]     \p{ASCII}
[[:Alpha:]]     \p{Alpha}
[[:Digit:]]     \p{Digit}
[[:Alnum:]]     \p{Alnum}
[[:Punct:]]     \p{Punct}
[[:Graph:]]     \p{Graph}
[[:Print:]]     \p{Print}
[[:Blank:]]     \p{Blank}
[[:Cntrl:]]     \p{Cntrl}
[[:XDigit:]]    \p{XDigit}
[[:Space:]]     \p{Space}

কারণ এটা মানে কিছু চাই যে এই একটি বাস্তব জগাখিচুড়ি Alpha, Lowerএবং Spaceকি না ইউনিকোড জাভা মানচিত্রে Alphabetic, Lowercaseঅথবা Whitespaceবৈশিষ্ট্য। এটা অত্যন্ত বিরক্তিকর। জাভার ইউনিকোড সম্পত্তি সমর্থন কঠোরভাবে অ্যান্টিমিলেন্নিয়াল , যার অর্থ এটি গত দশকে প্রকাশিত কোনও ইউনিকোড সম্পত্তি সমর্থন করে না।

হোয়াইটস্পেস সম্পর্কে সঠিকভাবে কথা বলতে না পারলে বিরক্তিকর। নিম্নলিখিত সারণী বিবেচনা করুন। এই কোড পয়েন্টগুলির জন্য প্রতিটি জাভা-এর জন্য জে-ফলাফল কলাম এবং পার্ল বা অন্য কোনও পিসিআর-ভিত্তিক রেজেক্স ইঞ্জিনের জন্য পি-ফলাফল কলাম উভয়ই রয়েছে:

             Regex    001A    0085    00A0    2029
                      J  P    J  P    J  P    J  P
                \s    1  1    0  1    0  1    0  1
               \pZ    0  0    0  0    1  1    1  1
            \p{Zs}    0  0    0  0    1  1    0  0
         \p{Space}    1  1    0  1    0  1    0  1
         \p{Blank}    0  0    0  0    0  1    0  0
    \p{Whitespace}    -  1    -  1    -  1    -  1
\p{javaWhitespace}    1  -    0  -    0  -    1  -
 \p{javaSpaceChar}    0  -    0  -    1  -    1  -

ওটা দেখ?

কার্যত সেই জাভা সাদা স্থানের ফলাফলগুলির প্রতিটিই ইউনিকোড অনুসারে ̲w̲r̲o̲n̲g̲। এটি সত্যিই একটি বড় সমস্যা। জাভা সবেমাত্র গণ্ডগোল করে, এমন উত্তর দেয় যা বিদ্যমান অনুশীলন অনুসারে এবং ইউনিকোড অনুসারে “ভুল”। প্লাস জাভা আপনাকে বাস্তব ইউনিকোড বৈশিষ্ট্যে অ্যাক্সেসও দেয় না! আসলে, জাভা ইউনিকোড হোয়াইটস্পেসের সাথে সম্পর্কিত এমন কোনও সম্পত্তি সমর্থন করে না ।


এই সমস্ত সমস্যার সমাধান এবং আরও অনেক কিছু

এই এবং অন্যান্য অনেক সম্পর্কিত সমস্যার সাথে মোকাবিলা করার জন্য, গতকাল আমি একটি 14 টি চারক্লাস পলায়নের পুনরায় লেখায় এমন একটি প্যাটার্ন স্ট্রিং পুনরায় লেখার জন্য একটি জাভা ফাংশন লিখেছিলাম:

\w \W \s \S \v \V \h \H \d \D \b \B \X \R

অনুমানযোগ্য এবং সামঞ্জস্যপূর্ণ ফ্যাশনে ইউনিকোডের সাথে ম্যাচ করার জন্য আসলে কাজ করে এমনগুলি দিয়ে তাদের প্রতিস্থাপন করে। এটি একটি একক হ্যাক সেশন থেকে কেবল একটি আলফা প্রোটোটাইপ, তবে এটি সম্পূর্ণ কার্যকরী।

সংক্ষিপ্ত বিবরণটি হ'ল আমার কোডটি নীচে 14 টি পুনর্লিখন করেছে:

\s => [\u0009-\u000D\u0020\u0085\u00A0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]
\S => [^\u0009-\u000D\u0020\u0085\u00A0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]

\v => [\u000A-\u000D\u0085\u2028\u2029]
\V => [^\u000A-\u000D\u0085\u2028\u2029]

\h => [\u0009\u0020\u00A0\u1680\u180E\u2000-\u200A\u202F\u205F\u3000]
\H => [^\u0009\u0020\u00A0\u1680\u180E\u2000\u2001-\u200A\u202F\u205F\u3000]

\w => [\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]]
\W => [^\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]]

\b => (?:(?<=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])(?![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])|(?<![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])(?=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]]))
\B => (?:(?<=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])(?=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])|(?<![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])(?![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]]))

\d => \p{Nd}
\D => \P{Nd}

\R => (?:(?>\u000D\u000A)|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029])

\X => (?>\PM\pM*)

কিছু বিষয় বিবেচনা করার জন্য ...

  • তার জন্য যে ব্যবহারসমূহ \Xসংজ্ঞা কি ইউনিকোড এখন বোঝায় হিসেবে উত্তরাধিকার গ্রাফিম ক্লাস্টার , কোনো বর্ধিত গ্রাফিম ক্লাস্টার , যেমন আধুনিক বরং জটিল। পার্ল নিজেই এখন ফ্যানসিয়ার সংস্করণ ব্যবহার করে তবে পুরানো সংস্করণটি এখনও সর্বাধিক সাধারণ পরিস্থিতিতে পুরোপুরি কার্যকর। সম্পাদনা: নীচে সংযোজন দেখুন।

  • কী করবেন তা \dআপনার অভিপ্রায়ের উপর নির্ভর করে তবে ডিফল্টটি ইউনোড সংজ্ঞা। আমি লোককে সবসময় চাই না এমন দেখতে পাই \p{Nd}তবে কখনও কখনও হয় [0-9]হয়ও \pN

  • দুটি সীমানা সংজ্ঞা \bএবং \B, বিশেষভাবে \wসংজ্ঞাটি ব্যবহার করার জন্য লেখা হয়েছে ।

  • এই \wসংজ্ঞাটি অত্যধিক বিস্তৃত, কারণ এটি কেবল গোলাকার অক্ষরগুলি নয়, প্যারেনড অক্ষরগুলিকে ধরে ফেলে। ইউনিকোড Other_Alphabeticসম্পত্তি জেডিকে 7 অবধি উপলব্ধ নয়, সুতরাং এটি আপনার পক্ষে সেরা।


সীমানা এক্সপ্লোর করা

১৯৮7 সালে ল্যারি ওয়াল পার্ল ১.০-এর জন্য প্রথম তাদের সম্পর্কে কথা বলার জন্য সিন্টেক্স \bএবং \Bসিনট্যাক্স তৈরি করার পরে বাউন্ডারিগুলি একটি সমস্যা হয়ে দাঁড়িয়েছে how কীভাবে \bএবং \Bউভয় কাজই বোঝার মূল বিষয়টি তাদের সম্পর্কে দুটি বিস্তৃত কল্পকাহিনীকে দূর করা:

  1. তারা হয় শুধুমাত্র কখনও খুঁজছেন জন্য \wশব্দ অক্ষর, কখনো অ শব্দ অক্ষরের জন্য।
  2. তারা স্ট্রিংয়ের প্রান্তটি বিশেষভাবে সন্ধান করে না।

একটি \bসীমানা মানে:

    IF does follow word
        THEN doesn't precede word
    ELSIF doesn't follow word
        THEN does precede word

এবং এগুলি সম্পূর্ণরূপে সরাসরি হিসাবে সংজ্ঞায়িত করা হয়:

  • নিম্নলিখিত শব্দ হয় (?<=\w)
  • পূর্ববর্তী শব্দ হয় (?=\w)
  • অনুসরণ না শব্দ হয় (?<!\w)
  • পূর্বের শব্দটি হয় না (?!\w)

অতএব, যেহেতু IF-THENএকটি হিসাবে এনকোডেড হয়েছে and ইডি-একসঙ্গে ABregexes, একটি orহল X|Y, এবং কারণ andপ্রাধান্য বেশি চেয়ে or, সহজভাবে যে AB|CD। সুতরাং প্রত্যেকটির \bঅর্থ একটি সীমানা নিরাপদে প্রতিস্থাপন করা যেতে পারে:

    (?:(?<=\w)(?!\w)|(?<!\w)(?=\w))

সঙ্গে \wউপযুক্ত ভাবে সংজ্ঞায়িত।

(আপনি এটা অদ্ভুত যে মনে হতে পারে Aএবং Cউপাদান বিপরীতের হয় একটি নিখুঁত বিশ্বে, আপনি যে লিখতে সক্ষম হওয়া উচিত। AB|Dকিন্তু এর জন্য যখন আমি ইউনিকোড বৈশিষ্ট্যের মিউচুয়াল বর্জন অসঙ্গতি নিচে পশ্চাদ্ধাবন ছিল - যা আমি মনে করি আমি যত্ন গ্রহণ করেছি , তবে আমি ডাবল শর্তটি কেবল সীমানায় রেখে দিয়েছি Plus এছাড়াও পরে আপনি অতিরিক্ত ধারণা পান তবে এটি আরও প্রসারিত করে)

জন্য \Bঅ গণ্ডি, যুক্তি হল:

    IF does follow word
        THEN does precede word
    ELSIF doesn't follow word
        THEN doesn't precede word

সমস্ত দৃষ্টান্তের \Bসাথে প্রতিস্থাপনের অনুমতি দেওয়া :

    (?:(?<=\w)(?=\w)|(?<!\w)(?!\w))

সত্যিই এটি আচরণ \bএবং \Bআচরণ। তাদের জন্য সমতুল্য নিদর্শনগুলি

  • \b((IF)THEN|ELSE)কনস্ট্রাক্ট ব্যবহার করে হয়(?(?<=\w)(?!\w)|(?=\w))
  • \B((IF)THEN|ELSE)কনস্ট্রাক্ট ব্যবহার করে হয়(?(?=\w)(?<=\w)|(?<!\w))

তবে সুনির্দিষ্ট সংস্করণগুলি AB|CDখুব ভাল, বিশেষত আপনার জাভেজ ভাষায় শর্তসাপেক্ষ নিদর্শনগুলির অভাব যেমন জাভার মতো। ☹

আমি ইতিমধ্যে টেস্ট স্যুইটের সাথে তিনটি সমতুল্য সংজ্ঞা ব্যবহার করে বাউন্ডারের আচরণ যাচাই করেছি যা প্রতি রান প্রতি 110,385,408 ম্যাচ পরীক্ষা করে এবং যা অনুযায়ী আমি এক ডজন বিভিন্ন ডেটা কনফিগারেশন চালিয়েছি:

     0 ..     7F    the ASCII range
    80 ..     FF    the non-ASCII Latin1 range
   100 ..   FFFF    the non-Latin1 BMP (Basic Multilingual Plane) range
 10000 .. 10FFFF    the non-BMP portion of Unicode (the "astral" planes)

তবে লোকেরা প্রায়শই আলাদা ধরণের সীমানা চায়। তারা এমন কিছু চায় যা সাদা জায়গা এবং স্ট্রিং অফ স্ট্রিং সচেতন:

  • বাম প্রান্ত হিসাবে(?:(?<=^)|(?<=\s))
  • ডান প্রান্ত হিসাবে(?=$|\s)

জাভা দিয়ে জাভা ঠিক করা

আমার অন্যান্য উত্তরে আমি পোস্ট করা কোডটি এটি এবং বেশ কয়েকটি অন্যান্য সুবিধাদি সরবরাহ করে। এর মধ্যে রয়েছে প্রাকৃতিক-ভাষার শব্দ, ড্যাশ, হাইফেন এবং অ্যাডোস্ট্রোফসের সংজ্ঞা এবং আরও কিছু includes

এটি আপনাকে ইউজিক্যাল ইউটিএফ -16 সারোগেটে নয়, লজিকাল কোড পয়েন্টগুলিতে ইউনিকোড অক্ষর নির্দিষ্ট করার অনুমতি দেয়। এটা কতটা গুরুত্বপূর্ণ তা বোঝা শক্ত! এবং এটি কেবল স্ট্রিং সম্প্রসারণের জন্য।

Regex charclass প্রতিকল্পন আপনার জাভা charclass তোলে regexes জন্য পরিশেষে ইউনিকোড উপর কাজ, এবং কাজের সঠিকভাবে দখল এখান থেকে পূর্ণ উৎস আপনি অবশ্যই এটি সঙ্গে করতে পারেন, অবশ্যই। আপনি যদি এটিকে সংশোধন করেন তবে আমি এটি শুনতে খুব পছন্দ করব, তবে আপনার দরকার নেই। এটি বেশ সংক্ষিপ্ত। মূল রেজেক্স পুনর্লিখন ফাংশনের সাহসগুলি সহজ:

switch (code_point) {

    case 'b':  newstr.append(boundary);
               break; /* switch */
    case 'B':  newstr.append(not_boundary);
               break; /* switch */

    case 'd':  newstr.append(digits_charclass);
               break; /* switch */
    case 'D':  newstr.append(not_digits_charclass);
               break; /* switch */

    case 'h':  newstr.append(horizontal_whitespace_charclass);
               break; /* switch */
    case 'H':  newstr.append(not_horizontal_whitespace_charclass);
               break; /* switch */

    case 'v':  newstr.append(vertical_whitespace_charclass);
               break; /* switch */
    case 'V':  newstr.append(not_vertical_whitespace_charclass);
               break; /* switch */

    case 'R':  newstr.append(linebreak);
               break; /* switch */

    case 's':  newstr.append(whitespace_charclass);
               break; /* switch */
    case 'S':  newstr.append(not_whitespace_charclass);
               break; /* switch */

    case 'w':  newstr.append(identifier_charclass);
               break; /* switch */
    case 'W':  newstr.append(not_identifier_charclass);
               break; /* switch */

    case 'X':  newstr.append(legacy_grapheme_cluster);
               break; /* switch */

    default:   newstr.append('\\');
               newstr.append(Character.toChars(code_point));
               break; /* switch */

}
saw_backslash = false;

যাইহোক, এই কোডটি কেবলমাত্র একটি আলফা রিলিজ, আমি সপ্তাহান্তে হ্যাক করেছি stuff এটি সেভাবে থাকবে না।

বিটার জন্য আমি মনস্থ করি:

  • কোড নকল একসাথে ভাঁজ করুন

  • বর্ধমান রেজেক্স পলায়নের বিপরীতে অনেস্কেপিং স্ট্রিং পলায়নের বিষয়ে একটি পরিষ্কার ইন্টারফেস সরবরাহ করুন

  • \dসম্প্রসারণে কিছুটা নমনীয়তা সরবরাহ করুন এবং সম্ভবত the\b

  • ঘুরতে এবং প্যাটার্ন ডটকমকেলে বা স্ট্রিং.ম্যাচগুলি বা আপনার জন্য হোয়াটনট কল করার সুবিধার্থে এমন পদ্ধতি সরবরাহ করুন

উত্পাদনের মুক্তির জন্য, এতে জাভাদোক এবং একটি জুনিত পরীক্ষা স্যুট থাকতে হবে। আমি আমার জিগেটেস্টার অন্তর্ভুক্ত করতে পারি, তবে এটি JUnit পরীক্ষা হিসাবে লেখা হয় না।


অভিযোজ্য বস্তু

আমার কাছে ভাল খবর এবং খারাপ খবর আছে।

সুসংবাদটি হ'ল আমি এখন একটি বর্ধিত গ্রাফেমি ক্লাস্টারের একটি উন্নত ব্যবহারের জন্য খুব কাছাকাছি সান্নিধ্য পেয়েছি \X

খারাপ খবর that যে প্যাটার্নটি হ'ল:

(?:(?:\u000D\u000A)|(?:[\u0E40\u0E41\u0E42\u0E43\u0E44\u0EC0\u0EC1\u0EC2\u0EC3\u0EC4\uAAB5\uAAB6\uAAB9\uAABB\uAABC]*(?:[\u1100-\u115F\uA960-\uA97C]+|([\u1100-\u115F\uA960-\uA97C]*((?:[[\u1160-\u11A2\uD7B0-\uD7C6][\uAC00\uAC1C\uAC38]][\u1160-\u11A2\uD7B0-\uD7C6]*|[\uAC01\uAC02\uAC03\uAC04])[\u11A8-\u11F9\uD7CB-\uD7FB]*))|[\u11A8-\u11F9\uD7CB-\uD7FB]+|[^[\p{Zl}\p{Zp}\p{Cc}\p{Cf}&&[^\u000D\u000A\u200C\u200D]]\u000D\u000A])[[\p{Mn}\p{Me}\u200C\u200D\u0488\u0489\u20DD\u20DE\u20DF\u20E0\u20E2\u20E3\u20E4\uA670\uA671\uA672\uFF9E\uFF9F][\p{Mc}\u0E30\u0E32\u0E33\u0E45\u0EB0\u0EB2\u0EB3]]*)|(?s:.))

যা জাভাতে আপনি লিখতে চাইবেন:

String extended_grapheme_cluster = "(?:(?:\\u000D\\u000A)|(?:[\\u0E40\\u0E41\\u0E42\\u0E43\\u0E44\\u0EC0\\u0EC1\\u0EC2\\u0EC3\\u0EC4\\uAAB5\\uAAB6\\uAAB9\\uAABB\\uAABC]*(?:[\\u1100-\\u115F\\uA960-\\uA97C]+|([\\u1100-\\u115F\\uA960-\\uA97C]*((?:[[\\u1160-\\u11A2\\uD7B0-\\uD7C6][\\uAC00\\uAC1C\\uAC38]][\\u1160-\\u11A2\\uD7B0-\\uD7C6]*|[\\uAC01\\uAC02\\uAC03\\uAC04])[\\u11A8-\\u11F9\\uD7CB-\\uD7FB]*))|[\\u11A8-\\u11F9\\uD7CB-\\uD7FB]+|[^[\\p{Zl}\\p{Zp}\\p{Cc}\\p{Cf}&&[^\\u000D\\u000A\\u200C\\u200D]]\\u000D\\u000A])[[\\p{Mn}\\p{Me}\\u200C\\u200D\\u0488\\u0489\\u20DD\\u20DE\\u20DF\\u20E0\\u20E2\\u20E3\\u20E4\\uA670\\uA671\\uA672\\uFF9E\\uFF9F][\\p{Mc}\\u0E30\\u0E32\\u0E33\\u0E45\\u0EB0\\u0EB2\\u0EB3]]*)|(?s:.))";

¡Tschüß!


10
এটা চমৎকার. অনেক ধন্যবাদ.
টিম পিটজ্যাকার

9
খ্রিস্ট, এটি একটি আলোকিত উত্তর। আমি কেবল জোন স্কিটের রেফারেন্স পাই না। এর সাথে তার কী করার আছে?
BalusC

12
@ বালুসসি: এটি জনের কাছে আগেই বলেছিল যে তিনি আমাকে প্রশ্নটি করার অনুমতি দেবেন। তবে দয়া করে t@Tchrist এ এড়িয়ে যাবেন না। এটা আমার মাথায় যেতে পারে। :)
tchrist

3
আপনি কি ওপেনজেডিকে যুক্ত করার বিষয়ে চিন্তাভাবনা করেছেন?
মার্টিজন ভার্বার্গ

2
@ মার্তিজন: আমার ছিল না, নেই; আমি জানতাম না যে এটি "উন্মুক্ত" ছিল। :) তবে আমি এটিকে আরও আনুষ্ঠানিক অর্থে প্রকাশ করার বিষয়ে চিন্তা করেছি; আমার বিভাগের অন্যরা এটি দেখতে চান (কোনও ধরণের ওপেন-সোর্স লাইসেন্স সহ, সম্ভবত বিএসডি বা এএসএল)। আমি সম্ভবত এই আলফা প্রোটোটাইপটিতে যা আছে তা থেকে API পরিবর্তন করতে যাচ্ছি, কোড পরিষ্কার করুন ইত্যাদি But তবে এটি আমাদের প্রচুর পরিমাণে সাহায্য করে , এবং আমরা অনুভব করি যে এটি অন্যকেও সহায়তা করবে। আমি সত্যই কামনা করি যে সান তাদের গ্রন্থাগারটি সম্পর্কে কিছু করবে তবে ওরাকল অবিশ্বাসের অনুপ্রেরণা জাগিয়ে তুলবে।
tchrist

15

এটি সত্যিই দুর্ভাগ্যজনক যে \wকাজ করে না। প্রস্তাবিত সমাধানটি \p{Alpha}আমার পক্ষেও কার্যকর হয় না।

দেখে মনে হচ্ছে এটি [\p{L}]সমস্ত ইউনিকোড চিঠিগুলি ধারণ করেছে। সুতরাং ইউনিকোড সমতুল্য হওয়া \wউচিত [\p{L}\p{Digit}_]


তবে \wঅঙ্কগুলি এবং আরও অনেক কিছু মেলে। আমি শুধু চিঠি জন্য মনে করি, \p{L}কাজ করবে।
টিম পিটজ্যাকার

তুমি ঠিক বলছো. \p{L}যথেষ্ট। এছাড়াও আমি ভেবেছিলাম যে কেবলমাত্র অক্ষরগুলিরই সমস্যা। [\p{L}\p{Digit}_]আন্ডারস্কোর সহ সমস্ত বর্ণমালার অক্ষর ধরা উচিত।
musiKk

@ মিউজিককে: সম্পূর্ণ সমাধানের জন্য আমার উত্তরটি দেখুন যা আপনাকে সাধারণভাবে আপনার নিদর্শনগুলি লেখার অনুমতি দেয়, তবে তারপরে এটি একটি ফাংশনটির মাধ্যমে পাস করুন যা জাভা এর ফাঁক ফাঁকির জন্য সংশোধন করে যাতে এটি ইউনিকোডে সঠিকভাবে কাজ করে।
tchrist

না, \wইউনিকোড দ্বারা সংজ্ঞায়িত করা হয়েছে \pLসমস্ত মূর্খ জিনিসের ন্যায় এবং ASCII সংখ্যাগুলির চেয়ে অনেক বেশি বিস্তৃত । আপনি [\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]]জাভাটির \wজন্য ইউনিকোড-সচেতন চাইলে আপনাকে অবশ্যই লিখতে হবে - বা আপনি এখানunicode_charclass থেকে আমার ফাংশনটি ব্যবহার করতে পারেন । দুঃখিত!
tchrist

1
@ টিম, হ্যাঁ, চিঠির জন্য \pLকাজ করে (আপনার এক-বর্ণের প্রপস আলিঙ্গনের দরকার নেই)। যাইহোক, আপনি খুব কমই এটি চান, কারণ আপনার ম্যাচটি ইউনিকোড নরমালাইজেশন ফর্ম ডি (ওরফে এনএফডি, যার অর্থ ক্যানোনিকাল পচা ) বনাম এনএফসি-তে থাকা এনএনএফিতে রয়েছে তার পরিবর্তে আপনার ম্যাচটি বিভিন্ন উত্তর না পেয়ে বরং সতর্ক থাকতে হবে can রচনা )। একটি উদাহরণ হ'ল কোড পয়েন্ট U + E9 ( "é") \pLএনএফসি ফর্মের একটি, তবে এর এনএফডি ফর্মটি ইউ + 65.301 হয়ে যায়, তাই মেলে \pL\pM। আপনি করতে পারেন ধরণ সঙ্গে এই কাছাকাছি পেতে \X: (?:(?=\pL)\X), কিন্তু আপনি জাভা যে আমার সংস্করণটি থাকতে হবে। :(
tchrist

7

জাভাতে, \wএবং \dইউনিকোড-সচেতন নয়; তারা কেবলমাত্র ASCII অক্ষরগুলির সাথে মেলে [A-Za-z0-9_]এবং [0-9]। একই জন্য যায় \p{Alpha}এবং বন্ধুদের (POSIX "চরিত্র শ্রেণীর" তারা স্থানীয়ের সংবেদনশীল হতে অনুমিত হয় উপর ভিত্তি করে করছি, কিন্তু জাভা তারা শুধুমাত্র কি কখনো ASCII অক্ষর মিলেছে থাকেন)। আপনি যদি ইউনিকোডের "শব্দের অক্ষরের সাথে" মিল রাখতে চান আপনাকে এটিকে বানান করতে হবে, উদাহরণস্বরূপ [\pL\p{Mn}\p{Nd}\p{Pc}], অক্ষরগুলির জন্য, নন-স্পেসিং মডিফায়ারগুলি (অ্যাকসেন্টস), দশমিক সংখ্যা এবং সংযোগ বিরামচিহ্নগুলি।

যাইহোক, জাভার \b হয় ইউনিকোড-জ্ঞানসম্পন্ন; এটি Character.isLetterOrDigit(ch)উচ্চারণযুক্ত অক্ষরের জন্যও ব্যবহার করে এবং পরীক্ষা করে, তবে এটি কেবল "সংযোগকারী বিরামচিহ্ন" অক্ষরটিকে স্বীকৃতি দেয় সেটি হ'ল আন্ডারস্কোর। সম্পাদনা করুন: আমি যখন আপনার নমুনা কোডটি চেষ্টা করি তখন এটি মুদ্রণ করে ""এবং élève"এটি হওয়া উচিত ( আইডোন.কম এ এটি দেখুন )।


আমি দুঃখিত, অ্যালান, তবে আপনি সত্যিই বলতে পারবেন না যে জাভা \bইউনিকোড ‐ বুদ্ধিমান। এটি প্রচুর পরিমাণে এবং ভুল করে। "\u2163=", "\u24e7=", এবং "\u0301="সব মিলেছে প্যাটার্ন করতে ব্যর্থ "\\b="জাভা কিন্তু হয় অনুমিত করুন - যেমন perl -le 'print /\b=/ || 0 for "\x{2163}=", "\x{24e7}=", "\x{301}="'প্রকাশ করে। তবে, যদি (এবং কেবলমাত্র) আপনি জাভাতে নেটিভের পরিবর্তে আমার শব্দের সীমার সংস্করণটিতে স্যুপ করে থাকেন \bতবে সেগুলিও জাভাতে কাজ করে।
tchrist

@ ক্রিশ্চট: আমি \bএএসসিআইআই পছন্দ \wও বন্ধুবান্ধব নয়, শুধুমাত্র ইউনিকোড চরিত্রগুলিতে (জাভাতে প্রয়োগ করা হয়েছে) ইউনিকোড চরিত্রগুলিতে কাজ করে তা নির্দেশ করে, আমি সঠিকতার বিষয়ে মন্তব্য করছিলাম না । যাইহোক, এটি \u0301যখন অক্ষরটি একটি বেস চরিত্রের সাথে যুক্ত হয়, ঠিক তেমন সম্মানের সাথে কাজ করে e\u0301=। এবং আমি নিশ্চিত নই যে জাভাটি এই পরিস্থিতিতে ভুল। কোনও চিঠিযুক্ত গ্রাফিম ক্লাস্টারের অংশ না থাকলে সম্মিলন চিহ্নকে কীভাবে একটি শব্দের চরিত্র হিসাবে বিবেচনা করা যেতে পারে?
অ্যালান মুর

3
অ্যালান, ইউনিকোড যখন বর্ধিত বনাম উত্তরাধিকারের গ্রাফেম ক্লাস্টারগুলি নিয়ে আলোচনা করে গ্রাফেম ক্লাস্টারগুলিকে স্পষ্ট করে তখন এটি এমন কিছু পরিষ্কার হয়েছিল। গ্রাফিম ক্লাস্টারের পুরানো সংজ্ঞা, যেখানে \Xকোনও চিহ্নের পরে কোনও সংখ্যা রয়েছে তার পরে সমস্যাটি সমস্যাযুক্ত, কারণ আপনার সমস্ত ফাইলকে ম্যাচিং হিসাবে বর্ণনা করতে সক্ষম হওয়া উচিত /^(\X*\R)*\R?$/, তবে আপনি যদি না \pMশুরু করতে পারেন তবে ফাইল বা এমনকি একটি লাইন। সুতরাং তারা সর্বদা কমপক্ষে একটি চরিত্রের সাথে মেলে এটির সম্প্রসারণ করেছে। এটি সর্বদা করত তবে এখন এটি উপরের প্যাটার্নটির কাজ করে। [… অব্যাহত…]
tchrist

2
@ অ্যালান, এটি জাভা এর স্থানীয় আঞ্চলিকভাবে \bইউনিকোড-সচেতন এর চেয়ে আরও ভাল ক্ষতি করে । "élève"প্যাটার্নের সাথে স্ট্রিংয়ের সাথে মিল রেখে বিবেচনা করুন \b(\w+)\b। সমস্যা দেখুন?
tchrist

1
@ ট্রিচ্রিস্ট: হ্যাঁ, শব্দ সীমানা ব্যতীত \w+দুটি মিল খুঁজে পেয়েছে: lএবং veএটি যথেষ্ট খারাপ। কিন্তু সঙ্গে শব্দ গণ্ডি এটা, কিছুই খুঁজে বের করে কারণ \bস্বীকার করে éএবং èশব্দ অক্ষর হিসেবে। খুব ন্যূনতম সময়ে, \bএবং \wকোনও শব্দের চরিত্র কী এবং কী নয় তা নিয়ে একমত হওয়া উচিত।
অ্যালান মুর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.