在正则表达式中为冒号添加条件

时间:2017-05-02 17:10:05

标签: regex

我正在尝试解析看起来像这样的成绩单中的文字:

  

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

Here is the desired result, which (with above regex) only happens if there is a colon after timestamp.

2 个答案:

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

请参阅:https://regex101.com/r/UZAnmW/6