Ответ 1
Я думаю, что в этом случае вы хотите отрицательный lookbehind, например:
foo.*(?<!bar)
Я ищу регулярное выражение, которое будет соответствовать строке, которая начинается с одной подстроки и не заканчивается определенной подстрокой.
Пример:
// Updated to be correct, thanks @Apocalisp
^foo.*(?<!bar)$
Соответствует всем, что начинается с "foo" и не заканчивается на "bar". Я знаю о синтаксисе [^...], но я не могу найти ничего, что сделает это для строки вместо одиночных символов.
Я специально пытаюсь сделать это для Java regex, но я столкнулся с этим раньше, поэтому ответы на другие двигатели регулярных выражений тоже будут отличными.
Благодаря @Kibbee для проверки того, что это работает и на С#.
Я думаю, что в этом случае вы хотите отрицательный lookbehind, например:
foo.*(?<!bar)
Я не знаком с Java regex, но документация для класса шаблонов предложила бы использовать (?! X) для не- -захват отрицательной обратной стороны нулевой ширины (он ищет что-то, что не является X в этом посту, не фиксируя его как обратную ссылку). Таким образом, вы можете сделать:
foo.*(?!bar) // not correct
Обновить: право Apocalisp, вы хотите отрицательный lookbehind. (вы проверяете, что совпадения. * не заканчиваются баром)
Подтвержденный ответ @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
Как говорили другие комментаторы, вам нужен негативный взгляд. В Java вы можете использовать этот шаблон:
"^first_string(?!.?second_string)\\z"