Подтвердить что ты не робот

Как сделать часть регулярного выражения необязательной?

Это пример строки:

123456#p654321

В настоящее время я использую это совпадение для захвата 123456 и 654321 в две разные группы:

([0-9].*)#p([0-9].*)

Но в некоторых случаях часть #p654321 строки будет отсутствовать, поэтому я хочу только захватить первую группу. Я попытался сделать вторую группу "необязательной", добавив к ней ?, которая работает, но только до тех пор, пока в конце оставшейся строки не будет #p.

Каким будет лучший способ решить эту проблему?

4b9b3361

Ответ 1

У вас есть #p вне группы захвата, что делает его необходимой частью результата. Вы также неправильно используете символ точки (.). Dot (в большинстве вариантов reg-ex) будет соответствовать любому персонажу. Измените его на:

([0-9]*)(?:#p([0-9]*))?

Синтаксис (?:) - это то, как вы получаете группу, не связанную с захватом. Затем мы записываем только цифры, которые вас интересуют. Наконец, мы делаем все возможное.

Кроме того, большинство вариантов reg-ex имеют класс символов \d для цифр. Таким образом, вы можете упростить еще больше:

(\d*)(?:#p(\d*))?

Как указал другой человек, оператор * мог потенциально соответствовать нулевым цифрам. Чтобы этого избежать, используйте вместо этого оператор +:

(\d+)(?:#p(\d+))?

Ответ 2

Ваше регулярное выражение фактически не будет содержать цифр, потому что вы использовали * вместо +.
Это то, что (я думаю) вам нужно:

(\d+)(?:#p(\d+))?