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

时间:2016-08-01 17:27:45

标签: php regex preg-match

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

John
+1 288298600
john@site.com

Billy

Mike
+1 768397651
mike@site.com

Patrick
+2 938468172

Jack
jack@site.com

我知道如何从中获取所有电子邮件和所有手机,但我想在这里做的不同。

我希望得到每个名字(John,Billy,Mike,Patrick,Jack)他们的电话(如果有的话)和他们的电子邮件(如果有的话)。所以匹配就像

'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)|.*?)

任何人都可以指导我朝正确的方向发展吗?

1 个答案:

答案 0 :(得分:0)

不要尝试使用多个匹配来执行此操作,它不会引导您到任何地方。相反,每个条目匹配一次,并使用捕获组来提取相关数据。

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

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

Demo

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

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