如何在PCRE中删除此捕获组中的冒号,同时仍能正确捕获?

时间:2014-08-01 02:01:06

标签: regex

鉴于此正则表达式

^(?P<book>[\d]?\s?[\D]+)(?P<chapter>\s[\d]*)?(?P<verse>[:|\s]+[\d]*)?$

如何在不搞乱“章节”组的情况下阻止冒号被捕获?如果我将冒号放在“Verse”组的左侧,“1 John 3”将注册为

[
  "book" => "1 John",
  "chapter" => "",
  "verse" => "3"
]

但是“约翰一书3:2”被捕获为

[
  "book" => "1 John",
  "chapter" => "3",
  "verse" => ":2"
]

Tool to Test in Realtime

我希望捕获排除冒号,因为它不应该是应用程序的工作来“修复”一个拙劣的正则表达式。

期望结果

[
  "book" => "1 John",
  "chapter" => "3",
  "verse" => "2"
]

修改

抱歉,没有意识到上面的链接没有保存我正在使用的文本。这是我正在测试的几个字符串:

1 John 3:12
Matthew 3
2 Peter 4:1
St John

1 个答案:

答案 0 :(得分:5)

如果我很清楚你想要做什么,你可以使用这种模式:

/^(?<book> (?:\d\h+)? [a-z]+(?:\h[a-z]+)* )
  (?:
      \h+ (?<chapter> \d+ )
      (?: : (?<verse> \d+ ) )?
  )?$
/xmi

online demo