正则表达式的可选匹配没有贪婪


Regular Expression optional matches without greediness

出于教育目的,我正在尝试匹配以下内容的名称、电话和电子邮件:

John
+1 288298600
john@site.com
Billy
Mike
+1 768397651
mike@site.com
Patrick
+2 938468172
Jack
jack@site.com

我知道如何从那里获得所有的电子邮件和电话,但我想在这里做的是不同的。

我想为每个名字(约翰、比利、迈克、帕特里克、杰克)弄到他们的电话(如果有的话)和电子邮件(如果有的)。所以比赛就像

'John',    '+1 288298600',  'john@site.com'
'Billy',   '',             ''
'Mike',    '+1 768397651', 'mike@site.com'
'Patrick', '+2 93868172',  ''
'Jack',    '',             'jack@site.com'

请注意,如果没有相应的信息(电话或电子邮件),它将匹配一个空字符串。我该怎么做?

我的尝试:([A-Za-z0-9]+)(?:.*?('+.*?)|.*?)(?:.*?(.*?'@site.com)|.*?)

有人能指引我朝正确的方向走吗?

不要试图使用多个匹配来实现这一点,这不会给你带来任何结果。相反,每个条目匹配一次,并使用捕获组提取相关数据。

下面是一个示例(带有mx标志):

^(?<name>['p{L}'h]+$)'R
(?:(?<phone>^'+['d'h]+$)'R)?
(?<mail>^.+?@.+?'..+)?

演示

第一行与名称匹配,后面跟着一行换行符。第二行是可选的——它匹配一个电话号码,后面跟着一个换行符。第三行也是可选的,与邮件匹配。

如果需要,您可以细化子模式,我只是选择了一些似乎可以与您的输入数据配合使用的子模式。