Регулярный поиск Java Pattern между строками - PullRequest
0 голосов
/ 29 августа 2018

Учитывая следующие строки (stringToTest):

  1. G2:7JAPjGdnGy8jxR8[RQ:1,2]-G3:jRo6pN8ZW9aglYz[RQ:3,4]
  2. G2:7JAPjGdnGy8jxR8[RQ:3,4]-G3:jRo6pN8ZW9aglYz[RQ:3,4]

И Узор:

Pattern p = Pattern.compile("G2:\\S+RQ:3,4");
if (p.matcher(stringToTest).find())
{
    // Match
}

Для строки 1 я НЕ хочу совпадать, потому что RQ: 3,4 связан с разделом G3, а не G2, и я хочу, чтобы строка 2 соответствовала, поскольку RQ:3,4 связан с разделом G2.

Проблема с текущим регулярным выражением состоит в том, что он ищет слишком далеко и в конечном итоге достигает RQ:3,4 в случае 1, хотя я не хочу рассматривать его за пределами раздела G2.

Также возможно, что stringToTest может быть (только один раздел):

G2:7JAPjGdnGy8jxR8[RQ:3,4]

Строки 7JAPjGdnGy8jxR8 и jRo6pN8ZW9aglYz являются хэшами переменной длины.

Может кто-нибудь помочь мне с правильным регулярным выражением для использования, чтобы начать смотреть на G2 для RQ:3,4, но остановиться, если он достигнет конца строки или -G (начало следующего раздела).

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Попробуйте использовать [^[] вместо \S в этом регулярном выражении: G2:[^[]*\[RQ:3,4

[^[] означает любой символ, кроме [

Демо

(учитывая, что такие строки: G2:7JAP[jGd]nGy8[]R8[RQ:3,4] невозможны)

0 голосов
/ 29 августа 2018

Проблема в том, что \S соответствует любому символу пробела, а механизм регулярных выражений анализирует текст слева направо. Как только он находит G2:, он захватывает все непробельные символы справа (поскольку \S* - жадный подшаблон), а затем возвращается, чтобы найти самое правое вхождение RQ:3,4.

В общем случае вы можете использовать

String regex = "G2:(?:(?!-G)\\S)*RQ:3,4";

См. Демонстрационную версию regex . (?:(?!-G)\S)* - это закаленный жадный токен, который будет соответствовать 0+ вхождениям непробельного символа, не начинающего подстроку -G.

Если дефис возможен только перед следующим разделом, вы можете вычесть - из \S:

String regex = "G2:[^\\s-]*RQ:3,4"; // using a negated character class
String regex = "G2:[\\S&&[^-]]*RQ:3,4"; // using character class subtraction

См. это демо регулярных выражений . [^\\s-]* будет соответствовать 0 или более символам, кроме пробелов и -.

0 голосов
/ 29 августа 2018

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

G2:(?:(?!G\d+:)\S)*RQ:3,4

RegEx Demo

Информация о регулярных платежах:

  • G2:: сопоставить буквенный текст G2:
  • (?: Создать группу без захвата
    • (?!G\d+:): утверждают, что у нас нет G<digit>: впереди нас
    • \S: сопоставить непробельный символ
  • )*: конец группы без захвата. Совпадение 0 или более из этого
  • RQ:3,4: сопоставить буквенный текст RQ:3,4

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

String re = "G2:(?:(?!G\\d+:)\\S)*RQ:3,4";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...