ইন রেগুলার এক্সপ্রেশন উইকিপিডিয়ার নিবন্ধ , এটা যে বলে মনে হয় [[:digit:]]
= [0-9]
= \d
।
তারা সমান না হলে এমন পরিস্থিতি কী? পার্থক্য কি?
কিছু গবেষণা করার পরে, আমি মনে করি একটি পার্থক্য হ'ল বন্ধনী প্রকাশটি [:expr:]
লোকাল নির্ভর।
ইন রেগুলার এক্সপ্রেশন উইকিপিডিয়ার নিবন্ধ , এটা যে বলে মনে হয় [[:digit:]]
= [0-9]
= \d
।
তারা সমান না হলে এমন পরিস্থিতি কী? পার্থক্য কি?
কিছু গবেষণা করার পরে, আমি মনে করি একটি পার্থক্য হ'ল বন্ধনী প্রকাশটি [:expr:]
লোকাল নির্ভর।
উত্তর:
হ্যাঁ, এটি [[: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 BRE বা ere জন্য: (POSIX নেই কিন্তু গনুহ হয় সমর্থিত নয় )।
পজিক্স দ্বারা অঙ্কের অক্ষর শ্রেণীর সাথে সামঞ্জস্য করা আবশ্যক, যার পরিবর্তে আইএসও সি দ্বারা 0 থেকে 9 এর মধ্যে অক্ষর হওয়া দরকার এবং অন্য কিছুই নয়। সুতরাং শুধুমাত্র সি লোকেল সব , , এবং ঠিক একই মানে। কোন সম্ভাব্য ভুল ব্যাখ্যা আছে, আরো ইউটিলিটি পাওয়া যায় এবং এটি শুধুমাত্র মানে সাধারণ । কয়েক ইউটিলিটি দ্বারা সমর্থিত হয়।\d
grep -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]}"'
۹ ߀߁߂߃߄߅߆߇߈߉ ९
এবং এটি ঘটতে প্রত্যাশিত বাগগুলির একটি নিশ্চিত উত্স।
iswctype()
এবং POSIX ইউটিলিটিগুলিতে BRE / ERE / ওয়াইল্ডকার্ডগুলি, [0-9] এবং [[: ডিজিট:]] ম্যাচটি কেবল 0123456789 এ। আর যে আদর্শ পরবর্তী সংস্করণ স্পষ্ট করা হবে
perl
's \d
অন্যান্য স্ক্রিপ্ট থেকে দশমিক সংখ্যা উপর মিলেছে ইউনিকোড মোডে আছে। তার জন্য ধন্যবাদ. PCRE সঙ্গে, দেখতে (*UCP)
গনুহ হিসেবে grep -Po '(*UCP)\d'
বা grep -Po '(*UCP)[[:digit:]]
ক্লাস ইউনিকোড বৈশিষ্ট্যের উপর ভিত্তি করে করা হবে।
[:digit:]
বাক্য গঠনটি আপনাকে স্থানীয়করণ ব্যবহার করতে চাইবে বলে মনে করবে, এটি ব্যবহারকারী হিসাবে অঙ্ক হিসাবে বিবেচনা করুন। আমি কখনই ব্যবহার করি না [:digit:]
কারণ অনুশীলনে এটি একইরকম [0-9]
এবং যে কোনও ক্ষেত্রেই মিল থাকতে পারে, আমি 0123456789-তে মিল রাখতে চাই, আমি কখনই মেলে না বলে বোঝাতে পারি না ٠١٢٣٤٥٦٧٨٩
এবং আমি এমন কোনও ব্যবহারের ক্ষেত্রে ভাবতে পারি না যেখানে কেউ দশমিক অঙ্কে ম্যাচ করতে চায় POSIX ইউটিলিটি সহ যে কোনও স্ক্রিপ্টে। Zsh এমএল সম্পর্কে বর্তমান আলোচনা[:blank:]
দেখুন । সেই চরিত্রের ক্লাসগুলি কিছুটা গোলমেলে।
এটি কীভাবে আপনি একটি সংখ্যাকে সংজ্ঞায়িত করেন তার উপর নির্ভর করে; [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()
একটি বিএসডি জিনিস, কমপক্ষে ম্যান পৃষ্ঠার উপর ভিত্তি করে
[0-9]
।
এর বিভিন্ন অর্থ [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 পরীক্ষার জন্য ব্যবহৃত হয়।
grep
এবং এর অনেকগুলি সংস্করণ sed
রয়েছে। এই উত্তরটি আরও কার্যকর হতে পারে যদি এতে বর্ণিত হয় যে এটির কোন সংস্করণ grep
এবং sed
এটির উল্লেখ রয়েছে। বা table টেবিলের উত্স কী, সেই বিষয়ে। 2) সেই টেবিলটি পাশাপাশি
re
মডিউলে নির্মিত অজগরটি [[: ডিজিট:]] সমর্থন করে না তবে লাইব্রেরিতে যুক্ত regex
এটি সমর্থন করে যাতে আমি সর্বদা কাজ করে কিছুটা নিগল করব। এটি সর্বদা পিক্সিক অভিযোগ পরিস্থিতিতে কাজ করে।
তাত্ত্বিক পার্থক্যগুলি ইতিমধ্যে অন্যান্য উত্তরে বেশ ভালভাবে ব্যাখ্যা করা হয়েছে, সুতরাং এটি ব্যবহারিক পার্থক্য ব্যাখ্যা করার জন্য রয়ে গেছে ।
একটি সংখ্যার সাথে ম্যাচ করার জন্য কয়েকটি সাধারণ ব্যবহারের ক্ষেত্রে এখানে:
প্রায়শই, আপনি যখন কিছু সংখ্যার ক্রাঙ্ক করতে চান, তখন নম্বরগুলি নিজেরাই একটি বিশ্রীভাবে ফর্ম্যাট করা পাঠ্য ফাইলে থাকে। আপনি আপনার প্রোগ্রামে ব্যবহারের জন্য এগুলি উত্তোলন করতে চান। আপনি সম্ভবত সংখ্যার ফর্ম্যাটটি (ফাইলটি দেখে) এবং আপনার বর্তমান লোকাল বলতে পারেন, সুতরাং যতক্ষণ না এটি কাজটি সম্পন্ন হয় ততক্ষণ কোনও ফর্ম ব্যবহার করা ঠিক । \d
কয়েকটি কিস্ট্রোকের প্রয়োজন, তাই এটি খুব সাধারণভাবে ব্যবহৃত হয়।
আপনার কাছে কিছু অবিশ্বস্ত ব্যবহারকারী ইনপুট রয়েছে (সম্ভবত কোনও ওয়েব ফর্ম থেকে) এবং আপনার এটি নিশ্চিত করতে হবে যে এতে কোনও বিস্ময় নেই। হতে পারে আপনি এটি একটি ডাটাবেসে সংখ্যাসূচক ক্ষেত্রে সংরক্ষণ করতে চান, বা একটি সার্ভারে চালনার জন্য শেল কমান্ডের পরামিতি হিসাবে ব্যবহার করতে পারেন। এই ক্ষেত্রে, আপনি সত্যিই চান [0-9]
, যেহেতু এটি সর্বাধিক সীমাবদ্ধ এবং অনুমানযোগ্য।
আপনার কাছে কিছুটা তথ্য রয়েছে যা আপনি "বিপজ্জনক" কোনও কিছুর জন্য ব্যবহার করতে যাচ্ছেন না তবে এটি একটি সংখ্যা কিনা তা জেনে ভাল লাগবে। উদাহরণস্বরূপ, আপনার প্রোগ্রামটি ব্যবহারকারীকে একটি ঠিকানা ইনপুট করতে দেয় এবং ইনপুটটিতে কোনও বাড়ির নম্বর না থাকলে আপনি একটি সম্ভাব্য টাইপো হাইলাইট করতে চান। এই ক্ষেত্রে, আপনি সম্ভবত যথাসম্ভব বিস্তৃত হতে চান, তেমনিভাবে [[:digit:]]
যাওয়ার উপায়ও রয়েছে।
এটি হ'ল অঙ্কের মিলের জন্য তিনটি সাধারণ ব্যবহারের কেস। আপনি যদি ভাবেন যে আমি একটি গুরুত্বপূর্ণ মিস করেছি, দয়া করে একটি মন্তব্য দিন।