如何让我的正则表达式适用于我的所有示例数据

时间:2016-01-25 15:18:41

标签: regex

我正在尝试编写一个捕获以下示例数据的正则表达式:

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个捕获组的正则表达式:

  1. 赛道代码(BEL)
  2. 页码(p1)
  3. Sire&大坝(QUENN ST.WEST-SMARTEN)
  4. Foaling State / Country(FL)
  5. 马名(DARNLEY BAY)
  6. 马性别(F)
  7. 年度(09)
  8. 比赛距离(1116)
  9. 比赛号码(第3场)
  10. 这是我的正则表达式:

    ^([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

    我很感激您对我如何改进正则表达式的任何建议。

1 个答案:

答案 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+)$