استفاده از رجکس ( RegEx ) برای جستجو در متن های فارسی
با سلام خدمت همه دوستان !
ان شاءالله بموازات آموزش استفاده از رجکس در متن های انگلیسی در تاپیک استفاده از Regular Expressions یا به اختصار RegEx برای جستجو و جایگذاری عبارت در متن در این تاپیک بطور اختصاصی به استفاده از رجکس ( RegEx ) برای جستجو در متن های فارسی می پردازیم.
البته با اطلاعات اندکی که بنده دارم استفاده از رجکس برای متن های فارسی براحتی جستجو در متن های انگلیسی نیست ولی ان شاءالله با کمک هم تا جائی که امکان استفاده از این آبجکت در متن های فارسی باشه سعی می کنیم از مثال ها و نمونه های کاربردی استفاده کنیم .
یا حق
نقل قول: استفاده از رجکس ( RegEx ) برای جستجو در متن های فارسی
در متن زیر میخواهیم جستجو بشه که آیا حروف یا کلمات فارسی وجود داره یا نه
RegExr was created by gskinner.com.
Edit the Expression & Text to see matches. Roll over matches or the expression for details. PCRE & JavaScript flavors of رجکس are supported. Validate your expression with Tests mode.
The side bar includes a Cheatsheet, full Reference, and کمک. You can also سave & Share with the Community and view patterns you create or favorite in My الگوها .
Explore results with the ابزارها below. Replace & List output custom results. Details lists capture groups. Explain describes your expression in plain انگلیسی.
برای این جستجو می توانیم عبارت پترن رو بصورت های زیر استفاده کنیم:
[آ-ی]+
یا در داخل براکت بجای حرف آ و ی میتوانیم از یونیکد اونها استفاده کنیم
بصورت زیر:
[\u0600-\u06FF]+
یا بصورت زیر :
[آابپتثجچحخدذرزژسشصضطظعغفق کگلمنوهی]+
حروف داخل براکت باید بدون فاصله و بهم چسبیده باشه
البته اگه اعداد فارسی هم به حروف فوق اضافه کنیم عبارت پترن بصورت زیر تغییر می کنه:
[آابپتثجچحخدذرزژسشصضطظعغفق کگلمنوهی۰۱۲۳۴۵۶۷۸۹]+
نقل قول: استفاده از رجکس ( RegEx ) برای جستجو در متن های فارسی
حالا بنظر شما برای اینکه تشخیص بدهیم که کل متن فارسیه یا نه از چه پترنی باید استفاده کنیم ؟
نقل قول: استفاده از رجکس ( RegEx ) برای جستجو در متن های فارسی
سلام و روز خوش
پترن دومی دقیق نیست و نباید استفاده بشه!
پترن اولی کمی بهتر از اونه ولی اون هم دقیق نیست.
پترن هایی مثل سومی و چهارمی بهترن چون بطور دقیق مشخص میکنین منظور شما از فارسی چی هست.
کلا وقتی با عبارتهای غیر انگلیسی لاتین (مثل آلمانی یا فرانسوی) کار میکنین، پترن هایی مثل [a-zA-Z] یا حتی w\ رو باید حواستون باشه.
چون اینها کارآکترهای extended دارن که باید جداگانه به پترن اضافه کنین.
این اشکال یا باگ نیست - تعریف w\ همینجور هست.
نقل قول: استفاده از رجکس ( RegEx ) برای جستجو در متن های فارسی
در تشخیص متن فارسی چیزهای دیگه هم هست که باید بهش دقت کرد:
کشیدگی : کــــشـــــیــــــده
سداها: بَرنامه جُستار نِگار خرّم
تنوین: فعلاً مثلاً
همزه: ۀ أ ء إ ؤ
نیم فاصله: پریزاد ماهپیشونی
و البته خود فاصله.
همه اینها در سناریو کار مشخص میشه،
برای هر کدوم اینها باید یک sub-pattern درست کرد،
و با توجه به شرایط اون رو درون [] اضافه کنیم.
نقل قول: استفاده از رجکس ( RegEx ) برای جستجو در متن های فارسی
نقل قول:
نوشته شده توسط
mazoolagh
سلام و روز خوش
پترن دومی دقیق نیست و نباید استفاده بشه!
پترن اولی کمی بهتر از اونه ولی اون هم دقیق نیست.
پترن هایی مثل سومی و چهارمی بهترن چون بطور دقیق مشخص میکنین منظور شما از فارسی چی هست.
کلا وقتی با عبارتهای غیر انگلیسی لاتین (مثل آلمانی یا فرانسوی) کار میکنین، پترن هایی مثل [a-zA-Z] یا حتی w\ رو باید حواستون باشه.
چون اینها کارآکترهای extended دارن که باید جداگانه به پترن اضافه کنین.
این اشکال یا باگ نیست - تعریف w\ همینجور هست.
سلام
درود بر شما
نقل قول: استفاده از رجکس ( RegEx ) برای جستجو در متن های فارسی
........................................
نقل قول: استفاده از رجکس ( RegEx ) برای جستجو در متن های فارسی
[\u0600-\u06FF]
اما چرا این پترن دقیق نیست و نباید استفاده کنیم،
جدول زیر کاملا نشون دهنده است:
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
A |
B |
C |
D |
E |
F |
| U+060x |
|
|
|
|
|
|
؆ |
؇ |
؈ |
؉ |
؊ |
؋ |
، |
؍ |
؎ |
؏ |
| U+061x |
ؐ |
ؑ |
ؒ |
ؓ |
ؔ |
ؕ |
ؖ |
ؗ |
ؘ |
ؙ |
ؚ |
؛ |
ALM |
؝ |
؞ |
؟ |
| U+062x |
ؠ |
ء |
آ |
أ |
ؤ |
إ |
ئ |
ا |
ب |
ة |
ت |
ث |
ج |
ح |
خ |
د |
| U+063x |
ذ |
ر |
ز |
س |
ش |
ص |
ض |
ط |
ظ |
ع |
غ |
ػ |
ؼ |
ؽ |
ؾ |
ؿ |
| U+064x |
ـ |
ف |
ق |
ك |
ل |
م |
ن |
ه |
و |
ى |
ي |
ً |
ٌ |
ٍ |
َ |
ُ |
| U+065x |
ِ |
ّ |
ْ |
ٓ |
ٔ |
ٕ |
ٖ |
ٗ |
٘ |
ٙ |
ٚ |
ٛ |
ٜ |
ٝ |
ٞ |
ٟ |
| U+066x |
٠ |
١ |
٢ |
٣ |
٤ |
٥ |
٦ |
٧ |
٨ |
٩ |
٪ |
٫ |
٬ |
٭ |
ٮ |
ٯ |
| U+067x |
ٰ |
ٱ |
ٲ |
ٳ |
ٴ |
ٵ |
ٶ |
ٷ |
ٸ |
ٹ |
ٺ |
ٻ |
ټ |
ٽ |
پ |
ٿ |
| U+068x |
ڀ |
ځ |
ڂ |
ڃ |
ڄ |
څ |
چ |
ڇ |
ڈ |
ډ |
ڊ |
ڋ |
ڌ |
ڍ |
ڎ |
ڏ |
| U+069x |
ڐ |
ڑ |
ڒ |
ړ |
ڔ |
ڕ |
ږ |
ڗ |
ژ |
ڙ |
ښ |
ڛ |
ڜ |
ڝ |
ڞ |
ڟ |
| U+06Ax |
ڠ |
ڡ |
ڢ |
ڣ |
ڤ |
ڥ |
ڦ |
ڧ |
ڨ |
ک |
ڪ |
ګ |
ڬ |
ڭ |
ڮ |
گ |
| U+06Bx |
ڰ |
ڱ |
ڲ |
ڳ |
ڴ |
ڵ |
ڶ |
ڷ |
ڸ |
ڹ |
ں |
ڻ |
ڼ |
ڽ |
ھ |
ڿ |
| U+06Cx |
ۀ |
ہ |
ۂ |
ۃ |
ۄ |
ۅ |
ۆ |
ۇ |
ۈ |
ۉ |
ۊ |
ۋ |
ی |
ۍ |
ێ |
ۏ |
| U+06Dx |
ې |
ۑ |
ے |
ۓ |
۔ |
ە |
ۖ |
ۗ |
ۘ |
ۙ |
ۚ |
ۛ |
ۜ |
|
۞ |
۟ |
| U+06Ex |
۠ |
ۡ |
ۢ |
ۣ |
ۤ |
ۥ |
ۦ |
ۧ |
ۨ |
۩ |
۪ |
۫ |
۬ |
ۭ |
ۮ |
ۯ |
| U+06Fx |
۰ |
۱ |
۲ |
۳ |
۴ |
۵ |
۶ |
۷ |
۸ |
۹ |
ۺ |
ۻ |
ۼ |
۽ |
۾ |
ۿ |
نقل قول: استفاده از رجکس ( RegEx ) برای جستجو در متن های فارسی
در مورد ارقام فارسی:
در stringها فارسی ارقام به همون صورت اصلی ذخیره میشن:
0123456789
فقط در نمایش تبدیل میشن (به تنظیمات سیستم و اکسس هم بستگی داره)
بنابراین اگر در سناریوی ما ارقام هم مجاز باشه باید همون d\ یا [0-9] رو بگذاریم.
گذاشتن شکل نمایش ارقام (کدهای 6F0 تا 06F9) در پترن نمیتونه ارقام رو شناسایی کنه،
مگر این که ارقام با این کدها ثبت شده باشن،
که از طریق کیبرد و تایپ در تکس باکس و ... این اتفاق نمیفته.
نقل قول: استفاده از رجکس ( RegEx ) برای جستجو در متن های فارسی
نقل قول:
نوشته شده توسط
mazoolagh
در تشخیص متن فارسی چیزهای دیگه هم هست که باید بهش دقت کرد:
کشیدگی : کــــشـــــیــــــده
سداها: بَرنامه جُستار نِگار خرّم
تنوین: فعلاً مثلاً
همزه: ۀ أ ء إ ؤ
نیم فاصله: پریزاد ماهپیشونی
و البته خود فاصله.
همه اینها در سناریو کار مشخص میشه،
برای هر کدوم اینها باید یک sub-pattern درست کرد،
و با توجه به شرایط اون رو درون [] اضافه کنیم.
فکر کنم یونیکد بیشتر موارد در درون [] در پترن زیر قرار داده باشم :
جهت احتیاط یونیکد ارقام فارسی هم اضافه کرده ام
[0-9\u06F0-\u06F9\u0660-\u0669\u0629\u0643\u0649-\u064B\u064D\u06D5\u060C\u061B\u061F\u0640\u066A\u 066B\u066C\u0621-\u0628\u062A-\u063A\u0641-\u0642\u0644-\u0648\u064E-\u0651\u0655\u067E\u0686\u0698\u06A9\u06AF\u06BE\u 06CC\u0020\u2000-\u200F\u2028-\u202F]+
regx.Pattern = "[0-9\u06F0-\u06F9\u0660-\u0669\u0629\u0643\u0649-\u064B\u064D\u06D5\u060C\u061B\u061F\" & _
"u0640\u066A\u066B\u066C\u0621-\u0628\u062A-\u063A\u0641-\u0642\u0644-\u0648\u064E-\u0651\" & _
"u0655\u067E\u0686\u0698\u06A9\u06AF\u06BE\u06CC\u 0020\u2000-\u200F\u2028-\u202F]+"
متوجه نشدم چرا در هنگام نمایش کدها بین یکی دوتا از یونیکدهای داخل [] فاصله ایجاد میشه