سؤال

أنا أكتب تعبيرات منتظمة لنص يونيكود في جافا. ومع ذلك، بالنسبة إلى البرنامج النصي الخاص الذي أستخدمه - Devanagari (0900 - 097f) هناك مشكلة في حدود الكلمات. B يطابق الأحرف التي تعتمد عليها حروف العلة (مثل 093E-094C) حيث يتم التعامل معها مثل الأحرف الفضائية.

مثال: افترض أن لدي السلسلة: "कमल कमाल कम्हल कम्हाल कम्हाल" ملاحظة أن "मा" في الكلمة الثانية يتم تشكيلها عن طريق الجمع بين म و u (المعترف بها كحرف فضاء). وبالمثل في الكلمة الأخيرة. هذا يؤدي B لمطابقة "ल" في "कमाल" مع التعبير العادي B W B غير صحيح وفقا للغة.

آمل أن يساعد المثال.

هل يمكنني كتابة تعبير منتظم يتصرف مثل B إلا أنه لا يتطابق مع بعض الأحرف؟ أي ردود فعل ستكون ممتنة.

هل كانت مفيدة؟

المحلول

يجب أن تكون قادرا على تحقيق ما تريد مع مشغلي Regex التالي:

(?=X)   X, via zero-width positive lookahead
(?!X)   X, via zero-width negative lookahead
(?<=X)  X, via zero-width positive lookbehind
(?<!X)  X, via zero-width negative lookbehind

(المذكورة أعلاه ونقلت عن جافا 6 نمط واجهة برمجة التطبيقات.)

يستخدم (?<![foo])(?=[foo]) بدلا من \b قبل كلمة، و (?<=[foo])(?![foo]) بدلا من \b بعد كلمة، حيث "[foo]"هل مجموعة" أحرف كلمة "

نصائح أخرى

ما يعادل حدود الكلمات (إذا كانت الحدود ليست ما كنت تتوقعه) سيكون:

 (?<!=[x-y])(<?=[x-y])...(?<=[x-y])(?![x-y])

وذلك لأن "حدود الكلمة" تعني "موقع توجد فيه شخصية على جانب واحد وليس من جهة أخرى)

وبالتالي مع التعبيرات المنظرية وراء وانظر إلى الأمام، يمكنك تحديد فئة الشخصيات الخاصة بك (XY] للتحقق عند الرغبة في عزل "حدود كلمة"

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top