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

Gol*_*a11 1 regex

鉴于此正则表达式

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

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

[
  "book" => "1 John",
  "chapter" => "",
  "verse" => "3"
]
Run Code Online (Sandbox Code Playgroud)

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

[
  "book" => "1 John",
  "chapter" => "3",
  "verse" => ":2"
]
Run Code Online (Sandbox Code Playgroud)

实时测试工具

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

期望的结果

[
  "book" => "1 John",
  "chapter" => "3",
  "verse" => "2"
]
Run Code Online (Sandbox Code Playgroud)

编辑

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

1 John 3:12
Matthew 3
2 Peter 4:1
St John
Run Code Online (Sandbox Code Playgroud)

Cas*_*yte 5

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

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

在线演示