View Full Version : آموزش: استفاده از رجکس ( RegEx ) برای جستجو در متن های فارسی
eb_1345
یک شنبه 04 آذر 1403, 21:01 عصر
با سلام خدمت همه دوستان !
ان شاءالله بموازات آموزش استفاده از رجکس در متن های انگلیسی در تاپیک استفاده از Regular Expressions یا به اختصار RegEx برای جستجو و جایگذاری عبارت در متن (https://barnamenevis.org/showthread.php?590028-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-Regular-Expressions-%DB%8C%D8%A7-%D8%A8%D9%87-%D8%A7%D8%AE%D8%AA%D8%B5%D8%A7%D8%B1-RegEx-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AC%D8%B3%D8%AA%D8%AC%D9%88-%D9%88-%D8%AC%D8%A7%DB%8C%DA%AF%D8%B0%D8%A7%D8%B1%DB%8C-%D8%B9%D8%A8%D8%A7%D8%B1%D8%AA-%D8%AF%D8%B1-%D9%85%D8%AA%D9%86) در این تاپیک بطور اختصاصی به استفاده از رجکس ( RegEx ) برای جستجو در متن های فارسی می پردازیم.
البته با اطلاعات اندکی که بنده دارم استفاده از رجکس برای متن های فارسی براحتی جستجو در متن های انگلیسی نیست ولی ان شاءالله با کمک هم تا جائی که امکان استفاده از این آبجکت در متن های فارسی باشه سعی می کنیم از مثال ها و نمونه های کاربردی استفاده کنیم .
یا حق
eb_1345
دوشنبه 05 آذر 1403, 13:11 عصر
در متن زیر میخواهیم جستجو بشه که آیا حروف یا کلمات فارسی وجود داره یا نه
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]+
یا بصورت زیر :
[آابپتثجچحخدذرزژسشصضطظعغفق کگلمنوهی]+
حروف داخل براکت باید بدون فاصله و بهم چسبیده باشه
البته اگه اعداد فارسی هم به حروف فوق اضافه کنیم عبارت پترن بصورت زیر تغییر می کنه:
[آابپتثجچحخدذرزژسشصضطظعغفق کگلمنوهی۰۱۲۳۴۵۶۷۸۹]+
eb_1345
دوشنبه 05 آذر 1403, 15:02 عصر
حالا بنظر شما برای اینکه تشخیص بدهیم که کل متن فارسیه یا نه از چه پترنی باید استفاده کنیم ؟
mazoolagh
دوشنبه 05 آذر 1403, 18:49 عصر
سلام و روز خوش
پترن دومی دقیق نیست و نباید استفاده بشه!
پترن اولی کمی بهتر از اونه ولی اون هم دقیق نیست.
پترن هایی مثل سومی و چهارمی بهترن چون بطور دقیق مشخص میکنین منظور شما از فارسی چی هست.
کلا وقتی با عبارتهای غیر انگلیسی لاتین (مثل آلمانی یا فرانسوی) کار میکنین، پترن هایی مثل [a-zA-Z] یا حتی w\ رو باید حواستون باشه.
چون اینها کارآکترهای extended دارن که باید جداگانه به پترن اضافه کنین.
این اشکال یا باگ نیست - تعریف w\ همینجور هست.
mazoolagh
دوشنبه 05 آذر 1403, 19:02 عصر
در تشخیص متن فارسی چیزهای دیگه هم هست که باید بهش دقت کرد:
کشیدگی : کــــشـــــیــــــده
سداها: بَرنامه جُستار نِگار خرّم
تنوین: فعلاً مثلاً
همزه: ۀ أ ء إ ؤ
نیم فاصله: پریزاد ماهپیشونی
و البته خود فاصله.
همه اینها در سناریو کار مشخص میشه،
برای هر کدوم اینها باید یک sub-pattern درست کرد،
و با توجه به شرایط اون رو درون [] اضافه کنیم.
eb_1345
دوشنبه 05 آذر 1403, 19:04 عصر
سلام و روز خوش
پترن دومی دقیق نیست و نباید استفاده بشه!
پترن اولی کمی بهتر از اونه ولی اون هم دقیق نیست.
پترن هایی مثل سومی و چهارمی بهترن چون بطور دقیق مشخص میکنین منظور شما از فارسی چی هست.
کلا وقتی با عبارتهای غیر انگلیسی لاتین (مثل آلمانی یا فرانسوی) کار میکنین، پترن هایی مثل [a-zA-Z] یا حتی w\ رو باید حواستون باشه.
چون اینها کارآکترهای extended دارن که باید جداگانه به پترن اضافه کنین.
این اشکال یا باگ نیست - تعریف w\ همینجور هست.
سلام
درود بر شما
eb_1345
دوشنبه 05 آذر 1403, 19:06 عصر
........................................
mazoolagh
سه شنبه 06 آذر 1403, 12:23 عصر
[\u0600-\u06FF]
اما چرا این پترن دقیق نیست و نباید استفاده کنیم،
جدول زیر کاملا نشون دهنده است:
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
U+060x
؆
؇
؈
؉
؊
؋
،
؍
؎
؏
U+061x
ؐ
ؑ
ؒ
ؓ
ؔ
ؕ
ؖ
ؗ
ؘ
ؙ
ؚ
؛
ALM (https://en.wikipedia.org/wiki/Arabic_letter_mark)
؝
؞
؟
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
۰
۱
۲
۳
۴
۵
۶
۷
۸
۹
ۺ
ۻ
ۼ
۽
۾
ۿ
mazoolagh
سه شنبه 06 آذر 1403, 12:44 عصر
در مورد ارقام فارسی:
در stringها فارسی ارقام به همون صورت اصلی ذخیره میشن:
0123456789
فقط در نمایش تبدیل میشن (به تنظیمات سیستم و اکسس هم بستگی داره)
بنابراین اگر در سناریوی ما ارقام هم مجاز باشه باید همون d\ یا [0-9] رو بگذاریم.
گذاشتن شکل نمایش ارقام (کدهای 6F0 تا 06F9) در پترن نمیتونه ارقام رو شناسایی کنه،
مگر این که ارقام با این کدها ثبت شده باشن،
که از طریق کیبرد و تایپ در تکس باکس و ... این اتفاق نمیفته.
eb_1345
چهارشنبه 07 آذر 1403, 10:18 صبح
در تشخیص متن فارسی چیزهای دیگه هم هست که باید بهش دقت کرد:
کشیدگی : کــــشـــــیــــــده
سداها: بَرنامه جُستار نِگار خرّم
تنوین: فعلاً مثلاً
همزه: ۀ أ ء إ ؤ
نیم فاصله: پریزاد ماهپیشونی
و البته خود فاصله.
همه اینها در سناریو کار مشخص میشه،
برای هر کدوم اینها باید یک 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\u0 020\u2000-\u200F\u2028-\u202F]+"
متوجه نشدم چرا در هنگام نمایش کدها بین یکی دوتا از یونیکدهای داخل [] فاصله ایجاد میشه
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.