[0-9], [[: অঙ্ক:]] এবং \ d এর মধ্যে পার্থক্য


35

ইন রেগুলার এক্সপ্রেশন উইকিপিডিয়ার নিবন্ধ , এটা যে বলে মনে হয় [[:digit:]]= [0-9]= \d

তারা সমান না হলে এমন পরিস্থিতি কী? পার্থক্য কি?

কিছু গবেষণা করার পরে, আমি মনে করি একটি পার্থক্য হ'ল বন্ধনী প্রকাশটি [:expr:]লোকাল নির্ভর।


3
না Wikipedia নিবন্ধটি যে আপনার লিঙ্ক আপনার প্রশ্নের উত্তর দিতে? বিভিন্ন নিয়মিত এক্সপ্রেশন প্রসেসর / ইঞ্জিনগুলি অক্ষর শ্রেণীর জন্য বিভিন্ন বাক্য গঠন সমর্থন করে (অন্যান্য জিনিসের মধ্যে)।
আইগল

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

উত্তর:


40

হ্যাঁ, এটি [[:digit:]]~ [0-9]~ \d(যেখানে ~ এর অর্থ অ্যাপ্রোমিক্স)।
বেশিরভাগ প্রোগ্রামিং ভাষায় (যেখানে এটি সমর্থিত) \d[[:digit:]](অভিন্ন)।
এর \dচেয়ে কম সাধারণ [[:digit:]](পসিক্সে নয় তবে এটি জিএনইউতে রয়েছে grep -P)।

আছে ইউনিকোডে অনেকগুলি সংখ্যা , উদাহরণস্বরূপ:

123456789 # Hindu-Arabic আরবি সংখ্যা
٠١٢٣٤٥٦٧٨٩ # ARABIC-INDIC
۰۱۲۳۴۵۶۷۸۹ # EXTENDED ARABIC-INDIC/PERSIAN
߀߁߂߃߄߅߆߇߈߉ # NKO DIGIT
०१२३४५६७८९ # DEVANAGARI

সবাই যার যা অন্তর্ভুক্ত করা যেতে পারে যে [[:digit:]]বা \d

পরিবর্তে, [0-9]কেবলমাত্র ASCII সংখ্যা হয় 0123456789


অনেকগুলি ভাষা রয়েছে: পার্ল, জাভা, পাইথন, সি। যার [[:digit:]](এবং \d) একটি বর্ধিত অর্থের জন্য ডাকে। উদাহরণস্বরূপ, এই পার্ল কোডটি উপরের সমস্ত অঙ্কের সাথে মিলবে:

$ a='0123456789 ٠١٢٣٤٥٦٧٨٩ ۰۱۲۳۴۵۶۷۸۹ ߀߁߂߃߄߅߆߇߈߉ ०१२३४५६७८९'

$ echo "$a" | perl -C -pe 's/[^\d]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९

যা ইউনিকোড বৈশিষ্ট্যযুক্ত Numericএবং সমস্ত অক্ষর নির্বাচন করার সমতুল্য digits:

$ echo "$a" | perl -C -pe 's/[^\p{Nd}]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९

কোন গ্রেপ পুনরুত্পাদন করতে পারে (পিসির নির্দিষ্ট সংস্করণে পার্লের তুলনায় সংখ্যার কোড পয়েন্টের একটি বিভক্ত অভ্যন্তরীণ তালিকা থাকতে পারে):

$ echo "$a" | grep -oP '\p{Nd}+'
0123456789
٠١٢٣٤٥٦٧٨٩
۰۱۲۳۴۵۶۷۸۹
߀߁߂߃߄߅߆߇߈߉
०१२३४५६७८९

এটি দেখতে [0-9] এ পরিবর্তন করুন:

$ echo "$a" | grep -o '[0-9]\+'
0123456789

POSIX

নির্দিষ্ট POSIX BRE বা ere জন্য: (POSIX নেই কিন্তু গনুহ হয় সমর্থিত নয় )। পজিক্স দ্বারা অঙ্কের অক্ষর শ্রেণীর সাথে সামঞ্জস্য করা আবশ্যক, যার পরিবর্তে আইএসও সি দ্বারা 0 থেকে 9 এর মধ্যে অক্ষর হওয়া দরকার এবং অন্য কিছুই নয়। সুতরাং শুধুমাত্র সি লোকেল সব , , এবং ঠিক একই মানে। কোন সম্ভাব্য ভুল ব্যাখ্যা আছে, আরো ইউটিলিটি পাওয়া যায় এবং এটি শুধুমাত্র মানে সাধারণ । কয়েক ইউটিলিটি দ্বারা সমর্থিত হয়।
\dgrep -P[[:digit:]][0-9][0123456789]\d[[:digit:]][0123456789][[:digit:]][0123456789]\d

হিসাবে [0-9], পরিসীমা এক্সপ্রেশন এর অর্থ কেবল সি লোকালে POSIX দ্বারা সংজ্ঞায়িত করা হয়; অন্যান্য লোকেলগুলিতে এটি আলাদা হতে পারে (কোডপয়েন্ট অর্ডার বা কোলেশন অর্ডার বা অন্য কিছু হতে পারে)।

শাঁস

কিছু বাস্তবায়ন প্লেস এএসসিআইআই অর্ডার (উদাহরণস্বরূপ ksh93) এর চেয়ে আলাদা কিছু হতে পারে এমন একটি ব্যাপ্তি বুঝতে পারে:

$ LC_ALL=en_US.utf8 ksh -c 'a="'"$a"'";echo "${a//[0-9]}"'
  ۹ ߀߁߂߃߄߅߆߇߈߉ ९

এবং এটি ঘটতে প্রত্যাশিত বাগগুলির একটি নিশ্চিত উত্স।


POSIX সিস্টেমগুলিতে অনুশীলনে, iswctype()এবং POSIX ইউটিলিটিগুলিতে BRE / ERE / ওয়াইল্ডকার্ডগুলি, [0-9] এবং [[: ডিজিট:]] ম্যাচটি কেবল 0123456789 এ। আর যে আদর্শ পরবর্তী সংস্করণ স্পষ্ট করা হবে
Stéphane Chazelas

আমি সচেতন ছিল perl's \dঅন্যান্য স্ক্রিপ্ট থেকে দশমিক সংখ্যা উপর মিলেছে ইউনিকোড মোডে আছে। তার জন্য ধন্যবাদ. PCRE সঙ্গে, দেখতে (*UCP)গনুহ হিসেবে grep -Po '(*UCP)\d'বা grep -Po '(*UCP)[[:digit:]]ক্লাস ইউনিকোড বৈশিষ্ট্যের উপর ভিত্তি করে করা হবে।
স্টাফেন চেজেলাস

আমি সম্মত হচ্ছি যে [:digit:]বাক্য গঠনটি আপনাকে স্থানীয়করণ ব্যবহার করতে চাইবে বলে মনে করবে, এটি ব্যবহারকারী হিসাবে অঙ্ক হিসাবে বিবেচনা করুন। আমি কখনই ব্যবহার করি না [:digit:]কারণ অনুশীলনে এটি একইরকম [0-9]এবং যে কোনও ক্ষেত্রেই মিল থাকতে পারে, আমি 0123456789-তে মিল রাখতে চাই, আমি কখনই মেলে না বলে বোঝাতে পারি না ٠١٢٣٤٥٦٧٨٩এবং আমি এমন কোনও ব্যবহারের ক্ষেত্রে ভাবতে পারি না যেখানে কেউ দশমিক অঙ্কে ম্যাচ করতে চায় POSIX ইউটিলিটি সহ যে কোনও স্ক্রিপ্টে। Zsh এমএল সম্পর্কে বর্তমান আলোচনা[:blank:] দেখুন । সেই চরিত্রের ক্লাসগুলি কিছুটা গোলমেলে।
স্টাফেন চেজেলাস

13

এটি কীভাবে আপনি একটি সংখ্যাকে সংজ্ঞায়িত করেন তার উপর নির্ভর করে; [0-9]কেবল এএসসিআইআই রয়েছে (বা সম্ভবত অন্য কিছু যা ASCII বা ASCII এর সুপারস্টেট নয় তবে ASCII তে একই 10 ডিজিট কেবলমাত্র বিভিন্ন বিট উপস্থাপনা (EBCDIC)) রয়েছে; \dঅন্যদিকে পারেন শুধু সাধারণ ডিজিটের (পার্ল পুরানো সংস্করণ বা পার্ল আধুনিক সংস্করণ হতে পারে /aরেগুলার এক্সপ্রেশন পতাকা সক্ষম করা থাকে) বা এটি একটি ইউনিকোড ম্যাচ হতে পারে \p{Digit}বদলে ডিজিটের একটি বৃহত্তর সেট যা [0-9]বা /\d/aম্যাচ।

$ perl -E 'say "match" if 42 =~ m/\d/'
match
$ perl -E 'say "match" if "\N{U+09EA}" =~ m/\d/'
match
$ perl -E 'say "match" if "\N{U+09EA}" =~ m/\d/a'
$ perl -E 'say "match" if "\N{U+09EA}" =~ m/[0-9]/'
$ 

perldoc perlrecharclass আরও তথ্যের জন্য, বা ভাষার কীভাবে এটি আচরণ করে তা প্রশ্নের জন্য ডকুমেন্টেশনের সাথে পরামর্শ করুন।

তবে অপেক্ষা করুন, আরও আছে! লোকেলগুলি কী \dমিলছে তার সাথেও তারতম্য হতে পারে , সুতরাং \dএর সম্পূর্ণ ইউনিকোড সেটের চেয়ে কম সংখ্যার সাথে মেলে, এবং (আশা করি, সাধারণত) এর মধ্যে অন্তর্ভুক্ত থাকে [0-9]। এটি সি ) এর মধ্যে পার্থক্য isdigit(3)( [0-9]) এবং isnumber(3)( [0-9লোকেল থেকে অন্য যে কোনও কিছু ) এর সমান ।

ডিজিটের মান অর্জনের জন্য এমন কলগুলি আসতে পারে, তা না থাকলেও [0-9]:

$ perl -MUnicode::UCD=num -E 'say num(4)'
4
$ perl -MUnicode::UCD=num -E 'say num("\N{U+09EA}")'
4
$ 

আমি মনে করি isnumber()একটি বিএসডি জিনিস, কমপক্ষে ম্যান পৃষ্ঠার উপর ভিত্তি করে
এমনটি

আমার কাছে বিএসডি পক্ষপাতিত্বের কিছু আছে, হ্যাঁ
2'18 এ ট্রিগার করুন

/ ফ্ল্যাগটি ইউনিকোড ডিজিটের তালিকা কেবলমাত্র মেলে দেখার জন্য হ্রাস করার জন্য একটি নির্দিষ্ট সীমাবদ্ধ ... / একটি সংশোধক ব্যবহার করে AS dকে কেবল ASCII 0 থেকে 9. এর সাথে মেলে জোর করতে। D ব্যবহার করা যেতে পারে । এর মতো, এটি ঠিক একই এবং কেবল মিল করতে বাধ্য করছে [0-9]
ইসহাক

5

এর বিভিন্ন অর্থ [0-9], [[:digit:]]এবং \dঅন্যান্য উত্তরে উপস্থাপন করা হয়। এখানে আমি রেজেক্স ইঞ্জিন বাস্তবায়নে পার্থক্য যুক্ত করতে চাই।

            [[:digit:]]    \d
grep -E               ✓     ×
grep -P               ✓     ✓
sed                   ✓     ×
sed -E                ✓     ×

তাই [[:digit:]]সর্বদা কাজ করে , \dনির্ভর করে। , Grep এর ম্যানুয়াল বলা হয়ে থাকে যে [[:digit:]]ঠিক 0-9মধ্যে Cলোকেল।

পিএস 1: আপনি যদি আরও জানেন তবে দয়া করে টেবিলটি প্রসারিত করুন।

PS2: GNU গ্রেপ 3.1 এবং GNU 4.4 পরীক্ষার জন্য ব্যবহৃত হয়।


2
1) GNU সংস্করণ বনাম অন্যদের মধ্যে সম্ভবত সবচেয়ে বড় পার্থক্য রয়েছে grepএবং এর অনেকগুলি সংস্করণ sedরয়েছে। এই উত্তরটি আরও কার্যকর হতে পারে যদি এতে বর্ণিত হয় যে এটির কোন সংস্করণ grepএবং sedএটির উল্লেখ রয়েছে। বা table টেবিলের উত্স কী, সেই বিষয়ে। 2) সেই টেবিলটি পাশাপাশি
পাঠ্যেও

@ilkkachu 1) সর্বশেষ GNU গ্রেপ 3.1 এবং GNU 4.4 পরীক্ষার জন্য ব্যবহৃত হয়। 2) আমি টেবিল তৈরি করতে পারি না। দেখে মনে হচ্ছে @ মুড়ু টেবিলটিকে সুন্দর পাঠ্য আকারে রূপান্তর করেছে।
হার্বিন

@ হারবিন দয়া করে আপনার উত্তরে এটি সম্পাদনা করুন।
ড্যান ডি

@DanD। সংস্করণ তথ্য যুক্ত। মনোযোগের জন্য
THX

1
নোট করুন যে reমডিউলে নির্মিত অজগরটি [[: ডিজিট:]] সমর্থন করে না তবে লাইব্রেরিতে যুক্ত regexএটি সমর্থন করে যাতে আমি সর্বদা কাজ করে কিছুটা নিগল করব। এটি সর্বদা পিক্সিক অভিযোগ পরিস্থিতিতে কাজ করে।
স্টিভ বার্নস

4

তাত্ত্বিক পার্থক্যগুলি ইতিমধ্যে অন্যান্য উত্তরে বেশ ভালভাবে ব্যাখ্যা করা হয়েছে, সুতরাং এটি ব্যবহারিক পার্থক্য ব্যাখ্যা করার জন্য রয়ে গেছে ।

একটি সংখ্যার সাথে ম্যাচ করার জন্য কয়েকটি সাধারণ ব্যবহারের ক্ষেত্রে এখানে:


এক-শট ডেটা নিষ্কাশন

প্রায়শই, আপনি যখন কিছু সংখ্যার ক্রাঙ্ক করতে চান, তখন নম্বরগুলি নিজেরাই একটি বিশ্রীভাবে ফর্ম্যাট করা পাঠ্য ফাইলে থাকে। আপনি আপনার প্রোগ্রামে ব্যবহারের জন্য এগুলি উত্তোলন করতে চান। আপনি সম্ভবত সংখ্যার ফর্ম্যাটটি (ফাইলটি দেখে) এবং আপনার বর্তমান লোকাল বলতে পারেন, সুতরাং যতক্ষণ না এটি কাজটি সম্পন্ন হয় ততক্ষণ কোনও ফর্ম ব্যবহার করা ঠিক\dকয়েকটি কিস্ট্রোকের প্রয়োজন, তাই এটি খুব সাধারণভাবে ব্যবহৃত হয়।

ইনপুট স্যানিটাইজিং

আপনার কাছে কিছু অবিশ্বস্ত ব্যবহারকারী ইনপুট রয়েছে (সম্ভবত কোনও ওয়েব ফর্ম থেকে) এবং আপনার এটি নিশ্চিত করতে হবে যে এতে কোনও বিস্ময় নেই। হতে পারে আপনি এটি একটি ডাটাবেসে সংখ্যাসূচক ক্ষেত্রে সংরক্ষণ করতে চান, বা একটি সার্ভারে চালনার জন্য শেল কমান্ডের পরামিতি হিসাবে ব্যবহার করতে পারেন। এই ক্ষেত্রে, আপনি সত্যিই চান [0-9], যেহেতু এটি সর্বাধিক সীমাবদ্ধ এবং অনুমানযোগ্য।

তথ্য বৈধতা

আপনার কাছে কিছুটা তথ্য রয়েছে যা আপনি "বিপজ্জনক" কোনও কিছুর জন্য ব্যবহার করতে যাচ্ছেন না তবে এটি একটি সংখ্যা কিনা তা জেনে ভাল লাগবে। উদাহরণস্বরূপ, আপনার প্রোগ্রামটি ব্যবহারকারীকে একটি ঠিকানা ইনপুট করতে দেয় এবং ইনপুটটিতে কোনও বাড়ির নম্বর না থাকলে আপনি একটি সম্ভাব্য টাইপো হাইলাইট করতে চান। এই ক্ষেত্রে, আপনি সম্ভবত যথাসম্ভব বিস্তৃত হতে চান, তেমনিভাবে [[:digit:]]যাওয়ার উপায়ও রয়েছে।


এটি হ'ল অঙ্কের মিলের জন্য তিনটি সাধারণ ব্যবহারের কেস। আপনি যদি ভাবেন যে আমি একটি গুরুত্বপূর্ণ মিস করেছি, দয়া করে একটি মন্তব্য দিন।


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