我正在尝试解析看起来像这样的成绩单中的文字:
LESTER HOLT(dfjk)(00:01:59):唐纳德特朗普前往总统职位的道路 可能是我们见过的最不寻常和非正统的。
首席司法官约翰罗伯茨(00:02:06):恭喜,先生 总统。
(00:02:08)(群众欢呼和掌声)
我正在寻找的物品是可选扬声器[即'LESTER HOLT'],然后是parantheses中的可选文本[即'(vo)'],然后是parantheses中的可选时间戳[即'(00:02:03)'],然后是文字[即'你好。']。 在时间戳之后,可能有也可能没有冒号[':']。参见上面的例子,最后一行,其中没有冒号。
我正在使用以下正则表达式:
([a-zA-Z\s]*?)?\s?(\([\w\s]*?\))?\s?(\(\d\d:\d\d:\d\d\))?\s?:(.*)(?:\n\n|$)
问题出现在上例中的最后一行。时间戳后缺少冒号会导致正则表达式无法捕获时间戳。
有关上述正则表达式的实现,请参阅https://regex101.com/r/UZAnmW/4。
答案 0 :(得分:1)
这个正则表达式可能有所帮助,它更简单,并使用可选的命名组来帮助提高可读性和访问结果:
SELECT c.customerID, o.OrderID, CASE When ISNULL(o.OrderID, 0) = 0 Then 0 Else 1 End as YesNOFROM Customers cLEFT JOIN Orders o ON c.customerID = o.customerID GROUP BY c.customerID
https://regex101.com/r/9MDLFU/4/
此外,你的正则表达式适用于couple changes :(第一组必须至少匹配一个字符,冒号是可选的,最后一组必须至少匹配一个字符):
(?<speaker>(?:\w+\s?)+)?(?<paren>\(\w+\)\s?)?(?<timestamp>\(.*?\))?:?(?<text>.+)
答案 1 :(得分:0)
怎么样?
([a-zA-Z]*(?:\s+[a-zA-Z]+)*)\s?(\([\w\s]*\))?\s?(\(\d\d:\d\d:\d\d\))?\s?:?(.*)(?:\n\n|$)