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

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

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Пример:

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

"^first_string(?!.?second_string)\\z"
  • ^ - гарантирует, что строка начинается с first_string
  • \z - гарантирует, что строка заканчивается на second_string
  • (?!.?second_string) - означает, что за first_string не может следовать second_string
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top