Подтвердить что ты не робот

Regex для сопоставления с чем-то, что не является определенной подстрокой

Я ищу регулярное выражение, которое будет соответствовать строке, которая начинается с одной подстроки и не заканчивается определенной подстрокой.

Пример:

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

Соответствует всем, что начинается с "foo" и не заканчивается на "bar". Я знаю о синтаксисе [^...], но я не могу найти ничего, что сделает это для строки вместо одиночных символов.

Я специально пытаюсь сделать это для Java regex, но я столкнулся с этим раньше, поэтому ответы на другие двигатели регулярных выражений тоже будут отличными.

Благодаря @Kibbee для проверки того, что это работает и на С#.

4b9b3361

Ответ 1

Я думаю, что в этом случае вы хотите отрицательный lookbehind, например:

foo.*(?<!bar)

Ответ 2

Я не знаком с Java regex, но документация для класса шаблонов предложила бы использовать (?! X) для не- -захват отрицательной обратной стороны нулевой ширины (он ищет что-то, что не является X в этом посту, не фиксируя его как обратную ссылку). Таким образом, вы можете сделать:

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

Обновить: право Apocalisp, вы хотите отрицательный lookbehind. (вы проверяете, что совпадения. * не заканчиваются баром)

Ответ 3

Подтвержденный ответ @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

Ответ 4

Как говорили другие комментаторы, вам нужен негативный взгляд. В Java вы можете использовать этот шаблон:

"^first_string(?!.?second_string)\\z"
  • ^ - гарантирует, что строка начинается с first_string
  • \z - гарантирует, что строка заканчивается на second_string
  • (?!.? second_string) - означает, что first_string не может следовать second_string