Как исключить части совпадений регулярного выражения? - PullRequest
1 голос
/ 01 июля 2019

Можно ли исключить части совпадений регулярного выражения? Возьмите этот сценарий в качестве примера:

FREE SOFT FOUNDATION V2 1989 PAGE 2
STALLMANWORKS 2000 1977;PAGE 2
THE GNU PAGE 3 1977

Я пытаюсь сопоставить только FREE SOFT FOUNDATION, STALLMANWORKS 2000 и THE GNU. Это легко, но теперь я должен исключить любую комбинацию [0-9;]+\s?(PAGE), которая идет после названия. Я пробовал негативно смотреть, но безуспешно:

(?!([0-9]+\s?(PAGE)))([A-Z0-9\s]+)

Ответы [ 3 ]

1 голос
/ 01 июля 2019

Если вы хотите получить только эти совпадения, вы можете использовать якорь ^, чтобы подтвердить начало строки;

В данных вашего примера кажется, что вам не нужны цифры перед страницей.

Возможно, вы могли бы использовать подход закаленный жадный токен , чтобы утверждать, что справа не PAGE, а затем соответствовать любому из классов персонажей [A-Z0-9\s].

Затем убедитесь, что совпадение заканчивается на A-Z в верхнем регистре, за которым следует граница слова \b a, при желании может совпадать с 4 цифрами после окончания на A-Z в верхнем регистре.

^(?:(?! PAGE)[A-Z0-9\s])+[A-Z](?: \d{4})?\b

Объяснение

  • ^ Начало строки
  • (?: Группа без захвата
    • (?! PAGE) Отрицательный взгляд, утверждаю, что прямо справа нет
    • [A-Z0-9\s] Соответствует любому из перечисленных в классе персонажей
  • )+ Закрыть группу без захвата и повторить 1+ раз
  • [A-Z] Соответствует A-Z в верхнем регистре, за которым следует граница слова
  • (?: \d{4})? При желании можно указать пробел и 4 цифры
  • \b Граница слова

Regex demo

0 голосов
/ 01 июля 2019

Вам нужно соединить отрицательный взгляд с каждым персонажем, которого вы подходите. В вашем примере regexp выполняет проверку с отрицательным прогнозом только на первый символ.

Что-то вроде:

((?:(?!\s+V?[0-9]|\s+PAGE)[A-Z0-9\s])+)
0 голосов
/ 01 июля 2019

Я не совсем уверен, что здесь может быть желательным, я думаю, что, возможно, это выражение

([\s\S].*?)\b((?:\s*\d+\s+;?|\s*\d+;)PAGE\s+\d+|\s*PAGE.*[0-9])

может быть в порядке, чтобы посмотреть.Здесь мы увидим, что мы хотели бы исключить, а затем просто добавим:

 ([\s\S].*?)

, чтобы собрать желаемые символы.

Демо

...