التعبير العادي الخاص بي يتطابق كثيرًا.كيف أجعله يتوقف؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

J0000000: Transaction A0001401 started on 8/22/2008 9:49:29 AM
J0000010: Project name: E:\foo.pf
J0000011: Job name: MBiek Direct Mail Test
J0000020: Document 1 - Completed successfully

لدي هذه السلسلة القبيحة العملاقة وأحاول استخراج أجزاء منها باستخدام التعبير العادي.

في هذه الحالة، أريد الحصول على كل شيء بعد "اسم المشروع" حتى الجزء الذي يقول "J0000011:" (سيكون الرقم 11 رقمًا مختلفًا في كل مرة).

هذا هو التعبير العادي الذي كنت ألعب به

Project name:\s+(.*)\s+J[0-9]{7}:

المشكلة هي أنه لا يتوقف حتى يصل إلى ج0000020: في نهايةالمطاف.

كيف أجعل التعبير العادي يتوقف عند أول ظهور لـ ي[0-9]{7}?

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

المحلول

يصنع .* غير الجشع بإضافة "?' بعد ذلك:

Project name:\s+(.*?)\s+J[0-9]{7}:

نصائح أخرى

ربما يكون استخدام محددات الكمية غير الجشعة هنا هو الحل الأفضل، لأنه أيضًا أكثر كفاءة من البديل الجشع:عادةً ما تذهب المطابقات الجشعة إلى أقصى حد ممكن (هنا، حتى نهاية النص!) ثم تتبع حرفًا تلو الآخر لمحاولة مطابقة الجزء التالي بعد ذلك.

ومع ذلك، فكر في استخدام فئة أحرف سلبية بدلاً من ذلك:

Project name:\s+(\S*)\s+J[0-9]{7}:

\S يعني "كل شيء باستثناء المسافة البيضاء وهذا هو بالضبط ما تريده.

حسنًا، ".*" هو محدد الجشع.أنت تجعلها غير جشعة باستخدام ".*?" عند استخدام البنية الأخيرة، سيقوم محرك regex بمطابقة النص في كل خطوة "." حاول مطابقة أي شيء يأتي بعد ".*?".هذا يعني أنه على سبيل المثال، إذا لم يأتي شيء بعد ".*?", ، ثم لا يتطابق مع أي شيء.

وهنا ما استخدمته. s يحتوي على السلسلة الأصلية الخاصة بك.هذا الرمز خاص بـ .NET، لكن معظم أشكال التعبير العادي ستحتوي على شيء مشابه.

string m = Regex.Match(s, @"Project name: (?<name>.*?) J\d+").Groups["name"].Value;

أود أيضًا أن أوصيك بتجربة التعبيرات العادية باستخدام "Expresso" - فهي أداة مساعدة رائعة (ومجانية) لتحرير واختبار التعبير العادي.

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

على سبيل المثال، عند إنشاء التعبير العادي الخاص بك باستخدام واجهة المستخدم، واختيار "*"، لديك القدرة على تحديد مربع الاختيار "أقل عدد ممكن" ورؤية التعبير العادي الناتج، بالإضافة إلى اختبار سلوكه، حتى لو لم تكن على دراية به تعبيرات غير الجشع من قبل.

متاح للتحميل على موقعهم:http://www.ultrapico.com/Expresso.htm

التحميل السريع :http://www.ultrapico.com/ExpressoDownload.htm

(اسم المشروع:\s+[A-Z]:(?:\\w+)+.[a-zA-Z]+\s+J[0-9]{7})(?=:)

هذا سوف يعمل من أجلك.

ستكون إضافة (?:\\w+)+.[a-zA-Z]+ أكثر تقييدًا بدلاً من .*

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