Регулярное выражение выбирает все цифры после префикса с минимальным и максимальным количеством цифр и пропуская нечисловые символы (максимум 4) - PullRequest
0 голосов
/ 01 февраля 2019

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

  • год контракта \ 12345678
  • контракт hjdhd: 87654321 оплачено
  • контракт somedata87654321T
  • контракт данных об ошибке: 1234567899Error -> thisимеет слишком много цифр

Общее ключевое слово "Контракт", после этого ключевого слова от 0 до 4 возможных нечисловых символов.Тогда номер договора, который всегда между 7 или 8 номерами.Когда есть больше цифр, его не следует выбирать.Я начал с (? <= Контракт) (. *) ([0-9] +), который выбирает много.Мне нужен только номер, и только если он состоит из 7 или 8 цифр. </p>

Если у вас есть решение, не могли бы вы также объяснить, как я могу извлечь из него уроки.

результат долженбыть

  • 12345678
  • 87654321
  • 87654321

Ответы [ 4 ]

0 голосов
/ 01 февраля 2019

Попробуйте это

\b[cC]ontract\D{0,4}(\d{7,8})(?:\D|$)

Демо

0 голосов
/ 01 февраля 2019

Вы можете использовать это регулярное выражение,

(?i)contract[^\d]{0,4}(\d{7,8})(?!\d)

Объяснение:

  • (?i) - Включает нечувствительное к регистру совпадение, как если бы у вас было Contractи другие contract
  • contract - буквально соответствует этому тексту
  • [^\d]{0,4} - соответствует любому символу от 0 до 4 раз, кроме цифры
  • (\d{7,8}) - соответствуетцифра длиной от 7 до 8
  • (?!\d) - отклоняет совпадение, если впереди есть цифра

Демо

0 голосов
/ 01 февраля 2019

Использование javascript: /contract(?!(\d{0-4}))(\d{7,8})(?!(\d))/i

"контракт", за которым следуют любые от 0 до 4 символов, которые не являются числовыми ((?!(\d{0-4})) означает строку длиной от 0 до 4, которая не содержит цифр) до последовательности7 или 8 цифр ((\d{7,8})), где следующий символ не является цифрой ((?!(\d))).Флаг i означает, что регулярное выражение нечувствительно к регистру.

После того, как я ответил, я увидел, что вопрос связан с .net.В c # вы можете использовать тот же шаблон (за исключением i в конце) и передать параметр RegexOptions.IgnoreCase.

0 голосов
/ 01 февраля 2019

Вы можете использовать квантификатор , чтобы указать количество цифр и не цифр, и использовать отрицательный lookahead , чтобы проверить, что после 7 или 8 цифр больше нет следующих цифр.

Чтобы сопоставить все варианты контракта, вы можете сделать регистр нечувствительным к регистру или подобрать контракт, например [Cc]ontract

(?<=\b[Cc]ontract)\D{0,4}([0-9]{7,8})(?!\d)

Regex demo

Thatбудет соответствовать

  • (?<=\b[Cc]ontract) Позитивный вид сзади, чтобы утверждать, что слева - это контракт или контракт (если вы не хотите использовать вид сзади, вы также можете сопоставить его вместо \b[Cc]ontract)
  • \D{0,4} Совпадение 0-4 раза, а не цифра
  • ([0-9]{7,8}) Захват в группе цифры 7-8 раз
  • (?!\d) Отрицательный взгляд, чтобы утверждать, что следуетне является цифрой

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

(?<=\b[Cc]ontract\D{0,4})[0-9]{7,8}(?!\d)

.NET regex demo

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