在字符串正则表达式

时间:2016-03-01 16:22:07

标签: php regex

我需要从以下几行中找出以下几行数据,我将分别处理每一行。

以下四行应涵盖需要分析的每种数据可能性:

// lines to be analyzed
Chuck Norris (M) - 12/1/2009 (5 years)
Rocky Joseph Balboa (M) - 2/26/2012 (2 years)
Mary-Jane Smith (F) - 03/12/2012 (6 years)
Patricia Howser-Silverstine (F) 5/04/2009 (11 years)

// data to be extracted
First name: Chuck Last name: Norris Gender: M Birthdate: 12/1/2009
First name: Rocky Last name: Joseph Balboa Gender: M Birthdate: 2/26/2012
First name: Mary-Jane Last name: Smith Gender: F Birthdate: 03/12/2012
First name: Patricia Last name: Howser-Silverstine Gender: F Birthdate: 5/04/2009

我想使用正则表达式捕获每行的第一个,姓氏,性别和生日,我将每个数据存储到一个变量中,以便稍后插入到数据库表中。我需要一个正则表达式列表,它可以找到我需要的每一段数据。

感谢任何帮助。

2 个答案:

答案 0 :(得分:6)

您可以使用此正则表达式捕获所有这些值:

$re = '~^(?<fname>[\p{L}-]+)\h+(?<lname>[\p{L}\h-]+?)\h+\((?<gender>[MF])\)[-\h]+(?<dob>[\d/]+)~mu';

RegEx Demo

答案 1 :(得分:1)

@ anubhava的回答是正确的,符合OP的要求。

如果需要匹配(或丢弃)中间名,则此变体使用可选的捕获组来执行此操作:

^(?<fname>[\p{L}-]+)\h+(?:(?<mname>[\p{L}-]+)\h+)?(?<lname>[\p{L}\h-]+?)\h+\((?<gender>[MF])\)[-\h]+(?<dob>[\d/]+)

演示:https://regex101.com/r/gB2cE3/4