التعابير المنطقية لمباراة STRING1 ما لم يسبقها سلسلة 2

StackOverflow https://stackoverflow.com/questions/1213525

سؤال

وعن طريق روبي، كيف يمكنني استخدام التعابير المنطقية واحد لتتناسب مع كافة تواجدات 'ذ' في "س ص ص س ص المنعم يوسف + ذ" التي لا تسبقها س (ذ، عبد المنعم يوسف، + ذ) منتديات / [^ س] ص / يطابق الحرف السابق أيضا، لذلك أنا بحاجة إلى بديل ...

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

المحلول

وتحتاج صفر-عرض السلبي تأكيد نظرة وراء. محاولة /(?<!x)y/ التي تقول بالضبط ما كنت أبحث عنه، أي إيجاد جميع 'ذ' لا سبقتها من قبل 'س'، ولكنه لا يشمل الطابع مسبق، وهو جزء من عرض صفر.

وقام لإضافة: يبدو أن هذا معتمد فقط من روبي 1.9 وتصل

نصائح أخرى

وسلبي نظرة وراء غير معتمد حتى روبي 1.9، لكن يمكنك أن تفعل شيئا من هذا القبيل باستخدام المسح الضوئي:

"xy y ay xy +y".scan(/([^x])(y)/) # => [[" ", "y"], ["a", "y"], ["+", "y"]]
"xy y ay xy +y".scan(/([^x])(y)/).map {|match| match[1]}  # => ["y", "y", "y"]

وبطبيعة الحال، هذا هو أكثر صعوبة إذا كنت ترغب في تجنب أكثر بكثير من مجرد حرف واحد قبل y. ثم عليك أن تفعل شيئا مثل:

"abby y crabby bally +y".scan(/(.*?)(y)/).reject {|str| str[0] =~ /ab/}  # => [[" ", "y"], [" ball", "y"], [" +", "y"]]
"abby y crabby bally +y".scan(/(.*?)(y)/).reject {|str| str[0] =~ /ab/}.map {|match| match[1]}  # => ["y", "y" "y"]

وروبي للأسف لا يدعم lookbehind سلبية، لذلك سيكون لديك مشكلة اذا كنت بحاجة الى ان ننظر لأكثر من حرف واحد. للحرف واحد فقط، يمكنك أن تأخذ الرعاية من ذلك عن طريق الاستيلاء على المباراة:

/[^x](y)/

في PCRE، يمكنك استخدام نظرة وراء السلبي:

(:<!x)y

ولست متأكدا إذا كان هذا معتمد من قبل روبي، ولكن هل يمكن أن ننظر دائما.

ويمكن ان يتم ذلك مع نظرة السلبي راءها، (?<!x)y

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