Regex, чтобы проверить, только если группа присутствует

У меня есть строка, которая может иметь значения, как показано ниже.

  1. 854METHYLDOPA
  2. 041ALDOMET / 00000101 /
  3. 133IODETO DE SODIO [I 131]

В этом мне нужно получить текст, начиная с индекса 4, пока мы не найдем любой из этих шаблонов / 00000101 / или [I 131]

Ожидаемый результат:

  1. метилдопа
  2. Aldomet
  3. ИОДЕТО ДЕ СОДИО

Я пробовал ниже RegEx для того же

(?:^ {3}.)(*.)(?:[[/][А-z0-9\ S]+[]/\ S +])

Но этот RegEx работает, если строка содержит [/, но не работает для case1, где эти шаблоны не существуют.

Я пытался добавить? в конце, но это работает для случая 1, но не работает для случаев 2 и 3.

Может кто-нибудь, пожалуйста, помогите мне получить работу регкс?

3 ответа

Вашу логику сложно сформулировать. Моя интерпретация заключается в том, что вы всегда хотите захватить с 4-го символа и далее. То, что еще захватывается, зависит от оставшейся части ввода. Должен ли /00000101/ или же [I 131] происходит, то вы хотите, чтобы захватить до этой точки. В противном случае вы хотите захватить всю строку. Объединение всего этого приводит к следующему регулярному выражению:

^.{3}(?:(.*)(?=/00000101/|\[I 131\])|(.*))

демонстрация

Вы можете получить значения, которые вы ищете в группе 1:

^.{3}(.+?)(?=$| ?\[I 131\]| ?\/00000101\/)

объяснение

  • С начала строки ^
  • Подходим первые 3 символа .{3}
  • Совпадение в группе захвата (где будут ваши значения) с любым персонажем один или несколько раз, не жадный (.+?)
  • Позитивный взгляд (?=
  • Чтобы утверждать, что следует, либо конец строки $
  • или же |
  • необязательный пробел ? затем [I 131] \[I 131\]
  • или же |
  • необязательный пробел ? с последующим /00000101/ \/00000101\/

Если ваш движок регулярных выражений поддерживает \K Вы можете попробовать это так, и значения, которые вы ищете, находятся не в группе, а в полном соответствии:

^.{3}\K.+?(?=$| ?\[I 131\]| ?\/00000101\/)

Вы можете попробовать это:

^.{3}(.*?)($|(?:\s*\/00000101\/)|(?:\s*\[I\s+131\])).*$

и замените это, чтобы получить точный вывод, который вы хотите.

\1

Regex Demo

Объяснение:

  1. ^ -> начало строки
  2. .{3} -> следуют 3 символа
  3. (.*?) -> после чего-нибудь, где? означает "ленивый", он получит, пока не найдет следующее и не пойдет дальше. Это также захватывает это как группа 1 -> \ 1
  4. ($|(?:\s*\/00000101\/)|(?:\s*\[I\s+131\])) ---------->
  5. $ -> заканчивается на $, что означает, что здесь нет такого шаблона, который вы упомянули
  6. | или же
  7. (?:\s*\/00000101\/) -> другой ваш образец, импровизированный с \s*, чтобы закрыть ноль или более пробелов.
  8. | или же
  9. (?:\s*\[I\s+131\]) -> другой ваш образец с импровизированным \s+, что означает 1 или более пробелов. ?: указывает, что мы не будем захватывать это.
  10. .*$ -> .* просто соответствует чему-либо следующему, а $ объявляет конец строки.
  11. таким образом, мы в конечном итоге собираем только группу 1 и ничего больше, что гарантирует замену всего на group 1, которая является вашим целевым выходом.
Другие вопросы по тегам