Regex - كيفية تطابق كل شيء ما عدا نمط معين

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

  •  03-07-2019
  •  | 
  •  

سؤال

كيف يمكنني كتابة regex لتتناسب مع أي سلسلة لا يلبي نمط معين?أنا واجهت وضعا حيث يجب أن يطابق (A و B~) نمط.

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

المحلول

هل يمكن استخدام نظرة إلى الأمام التأكيد:

(?!999)\d{3}

هذا المثال يطابق ثلاثة أرقام أخرى من 999.


ولكن إذا كنت يحدث أن يكون للتعبيرات المنتظمة مع هذه الميزة (انظر مقارنة العادية التعبير النكهات) ، ربما لديك لبناء التعبير العادي مع الميزات الأساسية الخاصة بك.

متوافق التعبير العادي مع الجملة الأساسية فقط ليكون:

[0-8]\d\d|\d[0-8]\d|\d\d[0-8]

هذا أيضا لا تتطابق مع أي ثلاثة أرقام تسلسل لا 999.

نصائح أخرى

إذا كنت تريد أن تطابق كلمة في سلسلة و لا تطابق كلمة B.على سبيل المثال:إذا كان لديك النص:

1. I have a two pets - dog and a cat
2. I have a pet - dog

إذا كنت ترغب في البحث عن أسطر من النص التي لديك كلب على الحيوانات الأليفة ، لا يكون القط يمكنك استخدام هذا التعبير العادية:

^(?=.*?\bdog\b)((?!cat).)*$

وسوف تجد فقط السطر الثاني:

2. I have a pet - dog

والمباراة ضد نمط واستخدام لغة المضيف لعكس منطقية نتيجة المباراة. وسيكون هذا أكثر مقروءا الكثير للصيانة.

notnot, إحياء القديم هذا السؤال لأنه قد حل بسيط أنه لم يكن المذكورة.(وجدت سؤالك أثناء القيام ببعض البحث regex فضله السعي.)

أنا واجهت وضعا حيث يجب أن يطابق (A و B~) نمط.

الأساسية regex هذا هو مخيف بسيطة: B|(A)

يمكنك فقط تجاهل العام المباريات ودراسة مجموعة 1 يلتقط ، والتي سوف تحتوي على ألف.

مثال (مع كل التنازلات عن تحليل html في regex):هي أرقام ، ب أرقام داخل <a tag

على regex: <a.*?<\/a>|(\d+)

Demo (انظر في المجموعة 1 في الجانب السفلي الأيسر)

المرجعية

كيفية تطابق النمط إلا في حالات s1, s2, s3

كيفية تطابق نمط ما لم...

وتكملة للغة العادية هي أيضا لغة العادية، ولكن لبناء ذلك لديك لبناء DFA للغة العادية، وإجراء أي تغيير حالة صالح في خطأ. انظر هذا للحصول على مثال. ما الصفحة لا يقول هو أنه تحويلها إلى /(ac|bd)/ /(a[^c]?|b[^d]?|[^ab])/. التحويل من DFA العودة إلى تعبير عادي ليست تافهة. فمن الأسهل إذا كان يمكنك استخدام التعبير العادي دون تغيير وتغيير معاني الكلمات في التعليمات البرمجية، مثل اقترح من قبل.

ونمط - إعادة

str.split(/re/g) 

وسيعود كل شيء ما عدا النمط.

هنا

جوابي هنا قد حل المشكلة:

https://stackoverflow.com/a/27967674/543814

  • بدلا من استبدال يمكنك استخدام المباراة.
  • بدلا من الفريق $1, ، يمكنك قراءة مجموعة $2.
  • المجموعة $2 وقدم عدم التقاط هناك ، والتي من شأنها أن تجنب.

على سبيل المثال:

Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");

أول التقاط مجموعة تحدد النمط الذي كنت ترغب في تجنب.آخر التقاط مجموعة يلتقط كل شيء آخر.ببساطة قراءة تلك المجموعة ، $2.

(B)|(A)

وبعد ذلك استخدام ما مجموعة 2 يلتقط ...

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