Regex, чтобы отменить весь захват, если ему непосредственно предшествует указанный c символ - PullRequest
2 голосов
/ 24 января 2020

С учетом следующего текста:

somerandomtext06251/750/somerandomtext/21399/10 79/20 8301

Как мне извлечь 06251/750, 79/20, 8301 и игнорировать 21399/10?

Общие правила:

  • в случайной строке соответствует каждой группе не менее 2 цифр, за которой следует необязательный /, а затем еще одна не менее 2 цифр; будьте жадны до цифр (возьмите как можно больше)
  • игнорируйте полное совпадение, если ему непосредственно предшествует /

Я начал со следующего шаблона совпадения:

 (?<invnr>\d{2,}/?\d{2,})

В целом, это работает, но у него есть только одна проблема: это также 21399/10. Итак, я добавил отрицательный вид сзади:

 (?<!/)(?<invnr>\d{2,}/?\d{2,})

Теперь он игнорирует первый ди git из 21399/10 (потому что ему предшествует /), но все же он захватывает все следующие символы, то есть 1399/10. Но мне нужно полностью пропустить 21399/10.

Как сделать так, чтобы закадровый взгляд отбрасывал весь матч и переходил к следующему, а не пропускал только один ди git?

Ответы [ 3 ]

3 голосов
/ 24 января 2020

Вы можете добавить шаблон di git внутри отрицательного вида сзади (комбинируя его с /, используя класс символов, [/\d]), чтобы убедиться, что совпадение не может произойти, если оно сразу следует за di * 1037. *:

(?<![/\d])\d{2,}(?:/\d{2,})?

См. Демонстрационную версию regex

Подробности

  • (?<![/\d]) - отрицательный взгляд сзади который не совпадает, если слева от текущего местоположения есть / или ди git
  • \d{2,} - две или более цифр
  • (?:/\d{2,})? - необязательно последовательность / и двух или более цифр.

Если вам нужно убедиться, что вы совпадаете только с цифрами ASCII, передайте опцию RegexOptions.ECMAScript компилятору regex внутри метод. NET, или используйте [0-9] вместо \d.

Обратите внимание, что ваш \d{2,}/?\d{2,} немного отключен, поскольку он не будет соответствовать 2 или 3 ди git последовательностям, только 4 + di git последовательности.

1 голос
/ 24 января 2020

Другой способ - сопоставить шаблон, начинающийся с /, и захватить те шаблоны, которые не входят в группу (), используя чередование |.

/[0-9]{2,}(?:/[0-9]{2,})?|(?<invnr>[0-9]+(?:/[0-9]{2,})?)
  • | Или
  • (?<invnr>[0-9]+(?:/[0-9]{2,})?) Захватить шаблон в группе invnr

. NET Regex demo (Нажмите на вкладку Таблица, чтобы увидеть значения группы)

1 голос
/ 24 января 2020

Хотя и не такой надежный, как ответ Wiktor , вы можете указать белый список разрешенных символов, предшествующих шаблону:

(?<=^|[ a-z])[0-9]{2,}(?:\/[0-9]{2,})?

Regex demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...