Регулярное выражение для сопоставления с чем-то, что не является определенной подстрокой - PullRequest
16 голосов
/ 04 сентября 2008

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

Пример:

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

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

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

Спасибо @Kibbee за проверку того, что это работает и в C #.

Ответы [ 4 ]

9 голосов
/ 04 сентября 2008

Я думаю, что в этом случае вы хотите негативный взгляд назад , вот так:

foo.*(?<!bar)
1 голос
/ 04 сентября 2008

Подтверждено @ 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
1 голос
/ 04 сентября 2008

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

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

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

0 голосов
/ 04 сентября 2008

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

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