我正在尝试编写一个捕获以下示例数据的正则表达式:
BEL p1 QUEEN ST.WEST-SMARTEN FL DARNLEY BAY F 09 1116 Race 3
BEL p2 OUTSTAND-BOLD N'FLASHY ON WE’LL TALK F 10 1116 Race 3
BEL p3 KAHLUA BAY-CATRAIL KY GO OLIVIA GO F 10 1116 Race 3
BEL p4 FORTUNATE CHANCE-AMERICAN CHANCE KYROSIE MY WAY F 10 1116 Race 3
BEL p5 ARBORESQUE-CURE THE BLUES AR TAYLOR JAGGER F 10 1116 Race 3
BEL p6 UNBRIDLED GLORY-UNBRIDLED KYLOVE THE BREEDING F 10 1116 Race 3
我创建了一个包含9个捕获组的正则表达式:
这是我的正则表达式:
^([A-Z]+)\s+(p[0-9]+)\s+([-'A-Z,.\s]+)\s+([A-Z]{1,3})\s+([A-Z\s']+)\s+([F|M])\s+([0-9]{1,2})\s+(.*)\s+(Race\s.*)$ /gm modifiers
不幸的是,我的表达式只适用于我的样本数据的第1行和第5行。我相信Row 2失败了,因为正则表达式与Sire&大坝或马的名字。其他未正确匹配的行似乎与foaling state / country有关。在某些情况下,州/国家/地区字段似乎进入了“马名称”字段,因此我的正则表达式将父系/水坝组视为一个(结合了父亲/水坝,驹区和马名)。
这是我在RegEx101上的正则表达式和结果:MyRegular Expression
我很感激您对我如何改进正则表达式的任何建议。
答案 0 :(得分:1)
它失败了,因为第二行中的撇号是’
,而不是'
。如果您将该角色添加到第5组,all rows match。
作为一项改进,这不符合你的想法:
([F|M])
这匹配F
,|
或M
。您可以通过删除[]
:
(F|M)
我进行了一些更改,包括删除文本可能发生的一些字符类,并将它们更改为.+
,因为您不希望列出所有可能的字符有领域。我还将[0-9]+
更改为仅使用\d+
,这是速记等效的。
^([A-Z]+)\s+(p\d+)\s+(.+)\s+([A-Z]{1,3})\s+(.+)\s+(F|M)\s+(\d{1,2})\s+(.+)\s+(Race\s+\d+)$