Regex, чтобы проверить, только если группа присутствует
У меня есть строка, которая может иметь значения, как показано ниже.
- 854METHYLDOPA
- 041ALDOMET / 00000101 /
- 133IODETO DE SODIO [I 131]
В этом мне нужно получить текст, начиная с индекса 4, пока мы не найдем любой из этих шаблонов / 00000101 / или [I 131]
Ожидаемый результат:
- метилдопа
- Aldomet
- ИОДЕТО ДЕ СОДИО
Я пробовал ниже 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
Объяснение:
^
-> начало строки.{3}
-> следуют 3 символа(.*?)
-> после чего-нибудь, где? означает "ленивый", он получит, пока не найдет следующее и не пойдет дальше. Это также захватывает это как группа 1 -> \ 1($|(?:\s*\/00000101\/)|(?:\s*\[I\s+131\]))
---------->- $ -> заканчивается на $, что означает, что здесь нет такого шаблона, который вы упомянули
- | или же
(?:\s*\/00000101\/)
-> другой ваш образец, импровизированный с \s*, чтобы закрыть ноль или более пробелов.- | или же
(?:\s*\[I\s+131\])
-> другой ваш образец с импровизированным \s+, что означает 1 или более пробелов.?:
указывает, что мы не будем захватывать это..*$
-> .* просто соответствует чему-либо следующему, а $ объявляет конец строки.- таким образом, мы в конечном итоге собираем только группу 1 и ничего больше, что гарантирует замену всего на group 1, которая является вашим целевым выходом.