Строка соответствия REGEX включает содержимое внутри необязательного разделителя

Я пытаюсь сопоставить строку, используя регулярное выражение, и я очень близок к тому, чтобы она работала так, как я хочу.

Допустим, у меня есть строка 5A(test1),4B,3C(test2)

Первое, что я делаю, это разбиваю строку на запятые, поэтому я получаю 3 строки в массиве.

  • 5А (тест1)
  • 4B
  • 3С (тест2)

Теперь я хочу получить следующую информацию; цифра, буква и содержание в скобках. Но скобки необязательны.

Вот моя выкройка ([1-9][0-9]*)([AaBbCcIiFfPpSs]+)(\(.*\))?

Это работает, за исключением того, что включает круглые скобки. поэтому я получаю
5 A (test1)
когда мне нужно
5 A test1

Я также пробовал ([1-9][0-9]*)([AaBbCcIiFfPpSs]+)\(([^)]*)\)?
Но это не соответствует строкам без круглых скобок, поэтому
5A (test1) и 3C (test2) совпадают, а 4B — нет.

Любая помощь будет оценена.


person lvaughan    schedule 01.03.2013    source источник


Ответы (2)


Немного измените регулярное выражение:

([1-9][0-9]*)([AaBbCcIiFfPpSs]+)(\((.*)\))?

Содержимое внутри () будет в группе захвата 4.

Если ваш язык поддерживает незахватывающую группу (?:pattern):

([1-9][0-9]*)([AaBbCcIiFfPpSs]+)(?:\((.*)\))?

Это предотвратит ненужный захват (сэкономит немного памяти), а содержимое внутри () будет в группе захвата 3.

person nhahtdh    schedule 01.03.2013
comment
Ваш второй ответ, кажется, обрабатывается быстрее на сервере (работает на Perl), так что спасибо, очень признателен :) - person lvaughan; 01.03.2013

Вам нужна дополнительная группа без захвата вокруг необязательной последней части

([1-9][0-9]*)([AaBbCcIiFfPpSs]+)(?:\(([^)]*)\))?

См. здесь, на Regexr.

person stema    schedule 01.03.2013
comment
Спасибо, это исправлено отлично! - person lvaughan; 01.03.2013