Поиск цифры в компоненте в разделе с помощью регулярного выражения - PullRequest
0 голосов
/ 12 сентября 2018

Учитывая приведенную ниже строку:

G1:NMXPAKW63roBnMZ[RQ:1,2]-G2:Q9M7mPl9X4NG9Ry[QC:1,5]-G3:1Bd57mPl9X4NG9Ry[QC:1,5]

У меня есть следующее регулярное выражение (основа которого взята из предыдущего вопроса):

 G2:(?:(?!-G)\S)*([^0-9]|^)1([^0-9]|$)

То, что я пытаюсь достичь, это«получить раздел, начинающийся с G2 и заканчивающийся перед следующим разделом», в данном случае -G3, затем «выполнить поиск по первой цифре».

Это работает, однако я хочу прекратить поиск назад, когда он попадетQC: часть, в настоящее время, если я заменю 1 в регулярном выражении на 9, это соответствует 9 в хеш-компоненте (Q9M7mPl9X4NG9Ry), который я не хочу.В разделе G2 я хочу искать совпадения только в компоненте QC: 1,5.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Подойдет следующее регулярное выражение: (?:^|-)G2:(?:(?!-G).)*QC:(?:(?!-G).)*(?<!\d)(\d+)

Работает следующим образом:

  • Найдите раздел G2: (?:^|-)G2:
    Это может быть либопервый раздел (ввод начинается с G2) или дополнительный раздел (соответствует -G2).

  • Пропуск случайного текста, но остановка на следующем разделе: (?:(?!-G).)*
    Это в основном .*, но с отрицательным прогнозом на будущее, чтобы остановиться, если . будет соответствовать - в -G.

  • Найдите QC: QC:

  • Пропустить случайный текст, но остановиться на следующем разделе: (?:(?!-G).)*

  • Совпадение с целым числом и его захват: (?<!\d)(\d+)

Второй «пропустить текст» найдет конец раздела и будет возвращаться оттуда до тех пор, пока не будет найдено число.

Поскольку мы возвращаемся, мынужен отрицательный оглядывающийся назад (?<!\d), чтобы гарантировать, что возврат не прекращается в середине числа.

См. демоверсию на regex101.com .

0 голосов
/ 12 сентября 2018

Регулярное выражение -G2:.*?\[(.*?)\] даст вам часть QC:1,5

Демо

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