Вы можете включить часть, которую вы хотите сопоставить, в группу без захвата: (?:)
. Затем он может рассматриваться как единое целое в регулярном выражении, и впоследствии вы можете поставить ?
после него, чтобы сделать его необязательным. Пример:
/Singers?:(.*)\s?(?:Lyricists?:(.*))?/
Обратите внимание, что здесь \s?
бесполезен, так как .*
будет жадно съедать всех персонажей, и откат не потребуется. Это также означает, что часть (?:Lyricists?:(.*))
никогда не будет сопоставлена по той же причине. Вы можете использовать нежадную версию .*
, .*?
вместе с $
, чтобы исправить это:
/Singers?:(.*?)\s*(?:Lyricists?:(.*))?$/
Некоторые лишние пробелы в конечном итоге захвачены; это также может быть удалено, давая окончательное регулярное выражение:
/Singers?:\s*(.*?)\s*(?:Lyricists?:\s*(.*))?$/