উচ্চারণযুক্ত চরিত্রগুলির জন্য কংক্রিট জাভাস্ক্রিপ্ট রেজেক্স (ডায়াক্রিটিক্স)


166

আমি স্ট্যাক ওভারফ্লো দেখেছি ( অক্ষরগুলি প্রতিস্থাপন করে .. হ্যাঁ , জাভাস্ক্রিপ্ট কীভাবে রেজিএক্সপ ইত্যাদি সম্পর্কিত ইউনিকোড স্ট্যান্ডার্ডটি অনুসরণ করে না ) এবং এই প্রশ্নের সত্যই উত্তর খুঁজে পাইনি:

How can JavaScript match for accented characters (those with diacritical marks)?

আমি UI তে একটি ক্ষেত্রটি ফরমেটের সাথে মেলে ধরতে বাধ্য করছি: last_name, first_name (শেষ [কমা স্থান] প্রথমে) , এবং আমি ডায়াক্রিটিকদের জন্য সমর্থন সরবরাহ করতে চাই তবে স্পষ্টতই জাভাস্ক্রিপ্টে এটি অন্যান্য ভাষা / প্ল্যাটফর্মের চেয়ে কিছুটা বেশি কঠিন।

আমি ডায়াস্রিটিক সমর্থন যুক্ত না করা পর্যন্ত এটি আমার আসল সংস্করণ ছিল:

/^[a-zA-Z]+,\s[a-zA-Z]+$/

সমর্থন যোগ করার জন্য বর্তমানে আমি তিনটি পদ্ধতির একটি নিয়ে বিতর্ক করছি, যার সবগুলিই আমি পরীক্ষা করেছি এবং কাজ করেছি (কমপক্ষে কিছুটা হলেও, আমি সত্যই জানি না যে "পদ্ধতির" দ্বিতীয় পদ্ধতির কী)) এখানে তারা:

স্পষ্টভাবে সমস্ত উচ্চারণযুক্ত অক্ষরগুলি তালিকাভুক্ত করছি যা আমি বৈধ (পঙ্গু এবং অত্যধিক জটিল) হিসাবে গ্রহণ করতে চাই:


var accentedCharacters = "àèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ";
// Build the full regex
var regex = "^[a-zA-Z" + accentedCharacters + "]+,\\s[a-zA-Z" + accentedCharacters + "]+$";
// Create a RegExp from the string version
regexCompiled = new RegExp(regex);
// regexCompiled = /^[a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]+,\s[a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]+$/
  • এটি কোনও সমর্থিত উচ্চারণযুক্ত অক্ষরের সাথে সঠিকভাবে একটি শেষ / প্রথম নামের সাথে মেলে accentedCharacters

আমার অন্য পদ্ধতিটি ছিল .চরিত্রের শ্রেণিটি ব্যবহার করা, একটি সহজ প্রকাশের জন্য:

var regex = /^.+,\s.+$/;
  • এটি প্রায় কোনও কিছুর জন্য মিলবে, কমপক্ষে: আকারে something, something। ঠিক আছে আমি মনে করি ...

সর্বশেষ পন্থা, যা আমি স্রেফ পেয়েছি এটি সম্ভবত সহজ ...

/^[a-zA-Z\u00C0-\u017F]+,\s[a-zA-Z\u00C0-\u017F]+$/
  • এটি ইউনিকোডের অনেকগুলি চরিত্রের সাথে মেলে - পরীক্ষিত এবং কাজ করা, যদিও আমি ক্রেজি কিছু চেষ্টা করি নি, অনুষদের সদস্যদের নামগুলির জন্য আমাদের ভাষা বিভাগে দেখি কেবল সাধারণ স্টাফ।

আমার উদ্বেগগুলি এখানে:

  1. প্রথম সমাধানটি খুব সীমাবদ্ধ, এবং তন্দ্রা এবং এতে সংশ্লেষিত। যদি আমি দু'একটি চরিত্র ভুলে গিয়েছিলাম তবে এটি পরিবর্তন করা দরকার এবং এটি কেবল খুব ব্যবহারিক নয়।
  2. দ্বিতীয় সমাধানটি আরও ভাল, সংক্ষিপ্ত, তবে এটি সম্ভবত এটির চেয়ে অনেক বেশি মিলছে। ঠিক কী .মেলে তার কোনও সত্যিকারের ডকুমেন্টেশন আমি খুঁজে পাইনি , কেবলমাত্র "নিউলাইন চরিত্র ব্যতীত কোনও চরিত্র" ( এমডিএন-এর একটি টেবিল থেকে ) সাধারণকরণ ।
  3. তৃতীয় সমাধানটি সর্বাধিক সুনির্দিষ্ট বলে মনে হচ্ছে, তবে কোনও গোটচ আছে? আমি অন্তত অনুশীলনে ইউনিকোড সঙ্গে খুব পরিচিত নই, কিন্তু এ খুঁজছেন কোড টেবিল / যে টেবিলের ধারাবাহিকতা , \u00C0-\u017Fঅন্তত আমার প্রত্যাশিত ইনপুট জন্য, চমত্কার কঠিন বলে মনে হয়।

    • অনুষদগুলি তাদের নামের সাথে তাদের মাতৃভাষায় ফর্ম জমা দেবে না (যেমন, আরবি, চীনা, জাপানি, ইত্যাদি) সুতরাং আমাকে লাতিন-বর্ণচিহ্ন-সেট অক্ষরের বাইরে নিয়ে চিন্তা করতে হবে না

সুতরাং আসল প্রশ্ন (গুলি) : এই তিনটি পদ্ধতির মধ্যে কোনটি কাজের জন্য সবচেয়ে উপযুক্ত? নাকি এর থেকে আরও ভাল সমাধান আছে?


1
আরও জটিল রেগেক্সপস ব্যবহার করার কোনও বিশেষ কারণ বলে মনে হচ্ছে না। সর্বাধিক সহজ সমাধান সম্পর্কে কেবলমাত্র এটি "কিছু, কিছু, কিছু" এর সাথেও মিলবে। আপনি regex = /^[^,]+,\s[^,]+$/;এটি প্রতিরোধ করার মতো কিছু ব্যবহার করতে পারেন ।
usr2564301

4
এক নজরে, প্রথমটির সাথে "ও'ডনেল, ক্রিস" বা হাইফেনের সাথে কোনও মিলের শেষের নাম বা একাধিক শেষ নাম (ইত্যাদি) মিলবে না। দেখুন মিথ্যাবাদী প্রোগ্রামাররা নাম সম্পর্কে বিশ্বাস শুধু প্রতি সম্ভব ফাঁদ সম্পর্কে জন্য।
usr2564301

" পরমাণু ছাড়া কিছু মিলে যায় নতুন লাইন " আসলে বেশ সঠিক হয় :-).
Bergi

1
যদি আপনার অতিরিক্ত লাইব্রেরি ব্যবহার করা সম্ভব হয় তবে আপনি আমার উত্তরটি এখানে দেখতে পারেন
স্টিমা

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

উত্তর:


275

সমস্ত উচ্চারণ গ্রহণ করার সহজ উপায় হ'ল:

[A-zÀ-ú] // accepts lowercase and uppercase characters
[A-zÀ-ÿ] // as above but including letters with an umlaut (includes [ ] ^ \ × ÷)
[A-Za-zÀ-ÿ] // as above but not including [ ] ^ \
[A-Za-zÀ-ÖØ-öø-ÿ] // as above but not including [ ] ^ \ × ÷

সংখ্যার ক্রমে তালিকাভুক্ত অক্ষরের জন্য https://unicode-table.com/en/ দেখুন ।


2
এটি দুর্দান্তভাবে কাজ করে, +1, তবে আপনি কেন এটি কাজ করে তা ব্যাখ্যা করতে পারেন?
পিয়েরে হেনরি

1
@ পিয়ারহেনরি -একটি ব্যাপ্তি সংজ্ঞায়িত করেছে এবং এই কৌশলটি চরসেটে অক্ষরগুলির ক্রমাগত সংক্ষিপ্তসারটিকে সংজ্ঞায়িত করতে সমস্যাটির দুর্দান্ত সংক্ষিপ্ত সমাধানের জন্য কাজে লাগিয়েছে
অঙ্গদ

8
হবে না এই ম্যাচে আন্ডারস্কোর (মধ্যে অন্যান্য অ-শব্দ অক্ষর Zএবং a)?
jcuenod

21
এটি কমপক্ষে [,], ^, এবং characters অক্ষরগুলির সাথে মেলে, এর মধ্যে কোনওটিই অন্তর্ভুক্ত করা উচিত নয়।
নাট

2
কাজ করছে না, এই পরিসরে কয়েকটি অক্ষর উচ্চারণকৃত অক্ষর নয় (উদাহরণস্বরূপ U + 00D7 গুণক চিহ্ন) এটি দেখুন: ইউনিকোড
টেবিল.

39

উচ্চারণযুক্ত লাতিন পরিসর \u00C0-\u017Fআমার নামের ডাটাবেসের জন্য যথেষ্ট পরিমাণে ছিল না, তাই আমি রেজিটাকে প্রসারিত করেছি

[a-zA-Z\u00C0-\u024F]
[a-zA-Z\u00C0-\u024F\u1E00-\u1EFF] // includes even more Latin chars

আমি এই কোড ব্লকগুলি যুক্ত করেছি ( \u00C0-\u024Fএকবারে তিনটি সংলগ্ন ব্লক অন্তর্ভুক্ত):

দ্রষ্টব্য যে \u00C0-\u00FFআসলে ল্যাটিন -১ পরিপূরকের মাত্র একটি অংশ । যে পরিসীমা অমুদ্রণীয় নিয়ন্ত্রণ সংকেত এবং সংখ্যাবৃদ্ধি awkwardly স্থানে থাকা × ছাড়া সব চিহ্ন অগ্রাহ্য \u00D7এবং ডিভাইড ÷ \u00F7

[a-zA-Z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u024F] // exclude ×÷

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

আসল রেজেক্স \u017F"সিনোল" নামটি নিয়ে কাঁপতে থামছে । ফন্টস্পেসের ইউনিকোড অ্যানালাইজারের মতে , সেই প্রথম চরিত্রটি হ'ল \u0218ল্যাটিন ক্যাপিটাল লেটার এস উইথ কম্বা । (হ্যাঁ, এটি সাধারণত একটি সিডিলা-এস দিয়ে বানান করা হয় \u015E, "সিনোল।" তবে আমি তাকে তুরস্কে যেতে বলছি না, "আপনি নিজের নামের বানান ভুল করছেন!")


1
ইউনিকোড টেবিল ল্যাটিন ব্লকের দিকে নজর রেখে আমার মনে হয় আপনারও \ u1e00- \ u1eff অন্তর্ভুক্ত করা উচিত, তাই আমি করছি[a-zA-Z\u00c0-\u024f\u1e00-\u1eff]
সিআরপ্রে্যাক

18

এই তিনটি পদ্ধতির মধ্যে কোনটি এই কাজের জন্য সবচেয়ে উপযুক্ত?

টাস্কটির উপর নির্ভর করে :-) সমস্ত লাতিন অক্ষর এবং তাদের বর্ণিত সংস্করণগুলির সাথে ঠিক মিল রাখতে ইউনিকোড রেঞ্জগুলি সম্ভবত সেরা সমাধান সরবরাহ করে। এগুলি সমস্ত অ-শ্বেত স্পেস অক্ষরে প্রসারিত হতে পারে যা \Sঅক্ষর শ্রেণীর ব্যবহার করে করা যেতে পারে ।

আমি ফর্ম্যাটটি মেলে একটি ইউআইতে একটি ক্ষেত্রটি জোর করছি: last_name, first_name(শেষ [কমা স্থান] প্রথমে)

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

/[^,]+,\s[^,]+/

তবে .চরিত্র শ্রেণীর সাথে আপনার দ্বিতীয় সমাধানটি ঠিক ততটাই দুর্দান্ত, আপনার কেবল তখন একাধিক কমমা সম্পর্কে যত্ন নেওয়া প্রয়োজন।


হুম, সম্ভবত আপনি ঠিক বলেছেন। আমি সম্ভবত এটি অত্যধিক জটিল ... আপনি সরবরাহিত রেজেক্স ব্যাখ্যা করতে পারেন? আমি এখন কিছু সময়ের জন্য রেইগেক্সের সাথে কাজ করছি, তবে কেবলমাত্র বেসিক স্টাফ এবং সত্যিকার অর্থে আপনার যা কিছু আছে সে সম্পর্কে আমার কোনও ধারণা নেই! হা
ক্রিস সাইরেফাইস

এটি একটি উপেক্ষিত চরিত্র শ্রেণি - যার অর্থ "কমা ব্যতীত অন্য কিছু"।
বার্গি

আহ, তাই এটি আরও ভালো লেগেছে any_character_not_a_comma, any_character_not_a_comma? আমি প্রথমবার এটি পড়ার পরে আমি যা ভেবেছিলাম, আমি সেখানে তিনটি কমা দেখলে আমি বিভ্রান্ত হয়ে পড়েছিলাম।
ক্রিস সাইরাফাইস

হ্যাঁ অবশ্যই. sহোয়াইটস্পেসের জন্য নিখোঁজ হওয়ার সাথে বিভ্রান্তির জন্য দুঃখিত ...
বার্গি

1
@ MateoTibaquirá আপনি প্রক্রিয়া সহজ করতে [^\s]করতে\S
Bergi

15

এক্সরেগএক্সপ্রেস লাইব্রেরিতে ইউনিকোড নামে একটি প্লাগইন রয়েছে যা এই জাতীয় কাজগুলিকে সমাধান করতে সহায়তা করে।

<script src="xregexp.js"></script>
<script src="addons/unicode/unicode-base.js"></script>
<script>
  var unicodeWord = XRegExp("^\\p{L}+$");

  unicodeWord.test("Русский"); // true
  unicodeWord.test("日本語"); // true
  unicodeWord.test("العربية"); // true
</script>

এটি প্রশ্নের মন্তব্যে উল্লেখ করা হয়েছে, তবে এটি মিস করা সহজ। আমি এই উত্তরটি জমা দেওয়ার পরে আমি এটি লক্ষ্য করেছি।


খুব সুন্দর, দেখা যাচ্ছে যে আসলে আমার ইউনিকোডে রেজেক্স প্রয়োজন হয়নি, বরং প্যাটার্নে anything, anything। এটি ভবিষ্যতের পাঠকদের জন্য দরকারী হবে :)
ক্রিস সাইরাফাইস


5

এই সম্পর্কে কি?

^([a-zA-Z]|[à-ú]|[À-Ú])+$

এটি প্রতিটি শব্দটির সাথে মিলবে মিলিত অক্ষরের সাথে বা না।


2
তবে ওপি উচ্চারণযুক্ত অক্ষরগুলিকে অনুমতি দিতে চায় ।
বারবসান


3
/^[\pL\pM\p{Zs}.-]+$/u

ব্যাখ্যা:

  • \pL - যে কোনও ভাষা থেকে যে কোনও বর্ণের সাথে মেলে
  • \pM - অন্য একটি চরিত্রের সাথে একত্রিত করার উদ্দেশ্যে একটি চরিত্র চিহ্নিত করে (যেমন উচ্চারণ, আমলাটস, ঘের বাক্স ইত্যাদি)
  • \p{Zs} - অদৃশ্য একটি সাদা বর্ণের চরিত্রের সাথে মেলে তবে জায়গা নেয়
  • u - প্যাটার্ন এবং বিষয়গুলির স্ট্রিংগুলি ইউটিএফ -8 হিসাবে বিবেচনা করা হয়

অন্যান্য প্রস্তাবিত রেজেক্স (যেমন [A-Za-zÀ-ÖØ-öø-ÿ]) এর বিপরীতে , এটি সমস্ত ভাষার নির্দিষ্ট অক্ষরের সাথে কাজ করবে, উদাহরণস্বরূপ Ššএই নিয়মের সাথে মিলেছে তবে এই পৃষ্ঠায় অন্যের সাথে এটি মেলে না।

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

const XRegExp = require('xregexp');

const isInputRealHumanName = (input: string): boolean => {
  return XRegExp('^[\\pL\\pM-]+ [\\pL\\pM-]+$', 'u').test(input);
};

1

আপনি বর্ণমালা থেকে ডায়াক্রিটিক্সগুলি মুছে ফেলতে পারেন:

var str = "résumé"`
str.normalize('NFD').replace(/[\u0300-\u036f]/g, '')` // returns resume

এটি সমস্ত ডায়াক্রিটিকাল চিহ্নগুলি সরিয়ে ফেলবে এবং তারপরে এটিতে আপনার রেজেক্স সম্পাদন করবে

রেফারেন্স:

https://thread.engineering/2018-08-29-searching-and-sorting-text-with-diacritical-marks-in-javascript/

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