Regex - كيفية تطابق كل شيء ما عدا نمط معين
سؤال
كيف يمكنني كتابة 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 في الجانب السفلي الأيسر)
المرجعية
وتكملة للغة العادية هي أيضا لغة العادية، ولكن لبناء ذلك لديك لبناء DFA للغة العادية، وإجراء أي تغيير حالة صالح في خطأ. انظر هذا للحصول على مثال. ما الصفحة لا يقول هو أنه تحويلها إلى /(ac|bd)/
/(a[^c]?|b[^d]?|[^ab])/
. التحويل من DFA العودة إلى تعبير عادي ليست تافهة. فمن الأسهل إذا كان يمكنك استخدام التعبير العادي دون تغيير وتغيير معاني الكلمات في التعليمات البرمجية، مثل اقترح من قبل.
جوابي هنا قد حل المشكلة:
https://stackoverflow.com/a/27967674/543814
- بدلا من استبدال يمكنك استخدام المباراة.
- بدلا من الفريق
$1
, ، يمكنك قراءة مجموعة$2
. - المجموعة
$2
وقدم عدم التقاط هناك ، والتي من شأنها أن تجنب.
على سبيل المثال:
Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");
أول التقاط مجموعة تحدد النمط الذي كنت ترغب في تجنب.آخر التقاط مجموعة يلتقط كل شيء آخر.ببساطة قراءة تلك المجموعة ، $2
.
(B)|(A)
وبعد ذلك استخدام ما مجموعة 2 يلتقط ...