Регулярное выражение может содержать группу или нет

#regex

#регулярное выражение

Вопрос:

У меня есть несколько строк для анализа. Этот текст может быть многострочным или нет. Кроме того, некоторая часть может отсутствовать. У меня есть несколько примеров, чтобы понять, что мне нужно.

Образцы;
1-однострочный) 00026A123456123456789012741852
2-многострочный) 00030A789ABC210987654321258369X123

X — это отдельные группы.
Я пытаюсь использовать это регулярное выражение: (?<group1>.*)(?:[X](?<group2>.*))

Комментарии:

1.Попробуйте ^(?<group1>.*?)(?:X(?<group2>.*))?$ . Разделяет ли последнее X группы или первое? Или может быть только 1 X ?

2. Спасибо, но не работает для первого. У первого нет второй группы. Моя демонстрация regex101.com/r/BJdSUb/1

3. Что вы подразумеваете под «нет второй группы»? Оно пустое. Как вы используете регулярное выражение? Не верьте тому, что вы видите в regex101, оно не отображает не участвующие группы. Это ошибка regex101.

4. Спасибо, Виктор, я понятия не имею об этой ошибке, регулярное выражение работает сейчас.

Ответ №1:

Если группы может разделять только 1 X , или это первое X , которое всегда разделяет группы, вы можете использовать

 ^(?<group1>.*?)(?:X(?<group2>.*))?$
  

Смотрите демонстрацию регулярных выражений.

Первый шаблон группы должен быть ленивой точкой .*? , а второй должен быть обернут необязательной группой без захвата (?:....)? .

Когда в тексте нет X... , вторая группа захвата считается не участвующей и, следовательно, является либо нулевой, либо пустой (в зависимости от того, где вы используете регулярное выражение).

Подробные сведения:

  • ^ — начало строки
  • (?<group1>.*?) — любые символы 0 (или исключая символы разрыва строки, в зависимости от механизма регулярных выражений) как можно меньше, вплоть до первого
  • (?:X(?<group2>.*))? — необязательная последовательность X , за которой следует как можно больше символов 0 , вплоть до
  • $ — конец строки.