Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.2k views
in Technique[技术] by (71.8m points)

regex optional word match

I'm trying to create a regex for extracting singers, lyricists. I was wondering how to make lyricists search optional.

Sample Multiline String:

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

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

This matches the second line correctly and extracts Singers(Madonna, Karen) and Lyricists(Madonna)

But it does not work with the first line, when there are no Lyricists.

How do I make Lyricists search optional?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can enclose the part you want to match in a non-capturing group: (?:). Then it can be treated as a single unit in the regex, and subsequently you can put a ? after it to make it optional. Example:

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

Note that here the s? is useless since .* will greedily eat all characters, and no backtracking will be necessary. This also means that the (?:Lyricists?:(.*)) part will never be matched for the same reason. You can use the non-greedy version of .*, .*? along with the $ to fix this:

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

Some extra whitespace ends up captured; this can be removed also, giving a final regex of:

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...