#regex
#регулярное выражение
Вопрос:
У меня есть несколько строк для анализа. Этот текст может быть многострочным или нет. Кроме того, некоторая часть может отсутствовать. У меня есть несколько примеров, чтобы понять, что мне нужно.
Образцы;
1-однострочный) 00026A123456123456789012741852
2-многострочный) 00030A789ABC210987654321258369X123
X — это отдельные группы.
Я пытаюсь использовать это регулярное выражение: (?<group1>.*)(?:[X](?<group2>.*))
Комментарии:
1.Попробуйте
^(?<group1>.*?)(?:X(?<group2>.*))?$
. Разделяет ли последнееX
группы или первое? Или может быть только 1X
?2. Спасибо, но не работает для первого. У первого нет второй группы. Моя демонстрация regex101.com/r/BJdSUb/1
3. Что вы подразумеваете под «нет второй группы»? Оно пустое. Как вы используете регулярное выражение? Не верьте тому, что вы видите в regex101, оно не отображает не участвующие группы. Это ошибка regex101.
4. Спасибо, Виктор, я понятия не имею об этой ошибке, регулярное выражение работает сейчас.
Ответ №1:
Если группы может разделять только 1 X
, или это первое X
, которое всегда разделяет группы, вы можете использовать
^(?<group1>.*?)(?:X(?<group2>.*))?$
Смотрите демонстрацию регулярных выражений.
Первый шаблон группы должен быть ленивой точкой .*?
, а второй должен быть обернут необязательной группой без захвата (?:....)?
.
Когда в тексте нет X...
, вторая группа захвата считается не участвующей и, следовательно, является либо нулевой, либо пустой (в зависимости от того, где вы используете регулярное выражение).
Подробные сведения:
^
— начало строки(?<group1>.*?)
— любые символы 0 (или исключая символы разрыва строки, в зависимости от механизма регулярных выражений) как можно меньше, вплоть до первого(?:X(?<group2>.*))?
— необязательная последовательностьX
, за которой следует как можно больше символов 0 , вплоть до$
— конец строки.