鉴于此正则表达式
^(?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"
]
我希望捕获排除冒号,因为它不应该是应用程序的工作来“修复”一个拙劣的正则表达式。
[
"book" => "1 John",
"chapter" => "3",
"verse" => "2"
]
抱歉,没有意识到上面的链接没有保存我正在使用的文本。这是我正在测试的几个字符串:
1 John 3:12
Matthew 3
2 Peter 4:1
St John
答案 0 :(得分:5)
如果我很清楚你想要做什么,你可以使用这种模式:
/^(?<book> (?:\d\h+)? [a-z]+(?:\h[a-z]+)* )
(?:
\h+ (?<chapter> \d+ )
(?: : (?<verse> \d+ ) )?
)?$
/xmi