سؤال

أنا أبحث عن التعابير المنطقية التي سوف تطابق سلسلة تبدأ مع واحد فرعية و لا ينتهي مع بعض فرعية.

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

// Updated to be correct, thanks @Apocalisp
^foo.*(?<!bar)$

يجب أن تتطابق مع أي شيء يبدأ مع "فو" و لا تنتهي مع "بار".أنا أعرف عن [^...] الجملة, ولكن أنا لا يمكن العثور على أي شيء من شأنها أن تفعل ذلك بالنسبة سلسلة بدلا من الحروف.

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

شكرا @Kibbee للتحقق من أن هذا يعمل في C# كما.

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

المحلول

أعتقد في هذه الحالة تريد السلبية lookbehind, مثل:

foo.*(?<!bar)

نصائح أخرى

التحقق @Apocalisp رد باستخدام:

import java.util.regex.Pattern;
public class Test {
  public static void main(String[] args) {
    Pattern p = Pattern.compile("^foo.*(?<!bar)$");
    System.out.println(p.matcher("foobar").matches());
    System.out.println(p.matcher("fooBLAHbar").matches());
    System.out.println(p.matcher("1foo").matches());
    System.out.println(p.matcher("fooBLAH-ar").matches());
    System.out.println(p.matcher("foo").matches());
    System.out.println(p.matcher("foobaz").matches());
  }
}

هذا إخراج الإجابات الصحيحة:

false
false
false
true
true
true

أنا لم تكن مألوفة مع جافا regex ولكن وثائق نمط الطبقة أقترح عليك أن تستخدم (?!X) غير التقاط صفر-عرض السلبية lookahead (يبدو أمرا لا X في ذلك postision دون التقاط أنها backreference).لذلك يمكن أن تفعل:

foo.*(?!bar) // not correct

التحديث:Apocalisp صحيح كنت تريد السلبية lookbehind.(أنت التحقق من أن ما .* المباريات لا تنتهي مع شريط)

وغيرها من المعلقين قال: كنت في حاجة الى السلبية lookahead.في جافا يمكنك استخدام هذا النمط:

"^first_string(?!.?second_string)\\z"
  • ^ - يضمن أن تبدأ سلسلة مع first_string
  • \z - يضمن أن سلسلة ينتهي مع second_string
  • (?!.?second_string) - يعني أن first_string لا يمكن أن يكون متبوعا second_string
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top