регулярное выражение необязательное совпадение слов - PullRequest
60 голосов
/ 10 марта 2011

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

Пример строки строки:

Fireworks Singer: Katy Perry
Vogue Singers: Madonna, Karen Lyricist: Madonna

Регулярное выражение: /Singers?:(.\*)\s?Lyricists?:(.\*)/

Это соответствует второй строке правильно и извлекает Singers(Madonna, Karen) и Lyricists(Madonna)

Но это не работает с первой строкой, когда нет лирики.

Как мне сделать поиск авторов текста необязательным?

Ответы [ 2 ]

92 голосов
/ 10 марта 2011

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

/Singers?:(.*)\s?(?:Lyricists?:(.*))?/

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

/Singers?:(.*?)\s*(?:Lyricists?:(.*))?$/

Некоторые лишние пробелы в конечном итоге захвачены; это также может быть удалено, давая окончательное регулярное выражение:

/Singers?:\s*(.*?)\s*(?:Lyricists?:\s*(.*))?$/
0 голосов
/ 10 марта 2011

Просто чтобы добавить к решению Кэмерон. если исходная строка имеет несколько строк, каждая из которых содержит как Singers, так и Lyricists, вам, вероятно, потребуется добавить многострочный модификатор 'm', чтобы '$' совпадал с концом строк. (Вы не сказали, какой язык вы используете - вы также можете добавить модификатор 'i'.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...