سؤال

أنا أعمل في تطبيق يبحث عن نص باستخدام تعبيرات منتظمة بناء على المدخلات من مستخدم. خيار واحد لديه المستخدم هو تضمين أحرف "تطابق 0 أو أكثر" باستخدام البدل باستخدام العلامة النجمية. أحتاج إلى هذا فقط المباراة بين حدود الكلمات. كانت محاولتي الأولى هي تحويل جميع العلامات النجمية إلى (?:(?=\B).)*, ، الذي يعمل بشكل جيد لمعظم الحالات. حيث فشل ذلك هو أنه يبدو أن .NET يعتبر الموضع بين حرف Unicode مع شخصيات وشخصية أخرى من كسر الكلمات. أنا أعتبر هذا الخطأ، وقدمته إلى Microsoft ملاحظات الموقع.

في غضون ذلك، أحتاج إلى الحصول على الوظيفة المنفذة والمنتج الذي يتم شحنه. أنا أفكر في استخدام [\p{L}\p{M}\p{N}\p{Pc}]* بصفتها نصيلا، ولكن بصراحة، أنا في "أنا لا أفهم حقا ما سيفعله هذا". أعني، يمكنني قراءة المواصفات، لكنني لست واثقا من أنني أستطيع اختبار هذا بما فيه الكفاية للتأكد من أن الأمر الذي أتوقعه. أنا ببساطة لن أعرف كل شروط الحدود لاختبارها. يستخدم التطبيق من قبل العاملين عبر الثقافات، والكثير منهم في المواقع القبلية، لذلك يجب دعم جميع أنظمة الكتابة، بما في ذلك بعضا من استخدام فواصل كلمة العرض الصفرية.

هل لدى أي شخص حلا أكثر أناقة، أو يمكن تأكيد / تصحيح الكود أعلاه، أو تقديم بعض المؤشرات؟

شكرا لمساعدتك.

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

المحلول

أي ما يعادل /(?:(?=\B).)*/ في سياق يونيكود سيكون:

/
(?:
  (?: (?<=[\p{L}\p{M}\p{N}\p{Pc}]) (?=[\p{L}\p{M}\p{N}\p{Pc}])
  |   (?<![\p{L}\p{M}\p{N}\p{Pc}]) (?![\p{L}\p{M}\p{N}\p{Pc}])
  )
  .
)*
/

... أو مبسطة إلى حد ما:

/(?:[\p{L}\p{M}\p{N}\p{Pc}]+|[^\p{L}\p{M}\p{N}\p{Pc}]+)?/

هذا من شأنه أن يتطابق مع تسلسل كلمة أو غير كلمة (تباعد، علامات الترقيم وما إلى ذلك)، وربما واحدة فارغة.

حدود كلمة طبيعية أو نفي (\b أو \B) هو في الأساس نظرة مزدوجة حولها. واحد يبحث وراء، والتأكد من نوع الشخصية التي تسبق الوضع الحالي. وبالمثل أحد نتطلع إلى الأمام.

في Regex الثاني، قمت بإزالة النظوف حولها واستخدام فئات الأحرف البسيطة بدلا من ذلك.

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