[英]Regex loop parsing with negative word lookahead
我试图解析以下字符串,但似乎无法弄清楚如何对单词使用正则表达式。 我有以下短信历史记录。
string = '2014-03-29 10:29:24 AM: John Doe: Hey dude how are you feeling 2014-03-29 10:30:39 AM: Billy: Hey Doe, Im feeling better now. 2014-03-29 10:30:58 AM: Billy: Yup'
我的正则表达式红宝石查询当前看起来像这样:
string.scan(/((\d{4}-\d{2}-\d{2}\s+\d{2}\:\d{2}\:\d{2}\s+[AP][M])\:\s(.*?)\:\s([^\d{4}]*))/) {|match| puts match}
Output:
2014-03-29 10:29:24 AM: John Doe: Hey dude how are you feeling
2014-03-29 10:29:24 AM
John Doe
Hey dude how are you feeling
2014-03-29 10:30:39 AM: Billy: Hey Doe, Im feeling better now.
2014-03-29 10:30:39 AM
Hason
Hey Doe, Im feeling better now.
2014-03-29 10:30:58 AM: Billy: Yup
2014-03-29 10:30:58 AM
Billy
Yup
问题
我的正则表达式否定词仅适用于字符,而不适用于单词。 [^ \\ d {4}]仅在它检测到任何数字而不是像'2014'这样的单词时才停止。
请尝试以下之一。 我曾经使用?:
来避免从您的正则表达式中捕获很少的组。 另外,添加正向前瞻(?=\\d{4}-|$)
以查看在下一行或其行尾是否有任何\\d\\d\\d\\d-
格式可用。 您可以根据需要将其更改为样式(我的意思是将其转换为yyyy-mm-dd
格式)。
string.scan(/((?:\d{4}-\d{2}-\d{2}\s+\d{2}\:\d{2}\:\d{2}\s+[AP][M])\:\s(?:.*?)\:.*?)(?=\d{4}-|$)/) {|match| puts match}
输出:
2014-03-29 10:29:24 AM: John Doe: Hey dude how are you feeling
2014-03-29 10:30:39 AM: Billy: Hey Doe, Im feeling better now.
2014-03-29 10:30:58 AM: Billy: Yup
您可以将所有内容匹配到一个特定的“单词”,例如带有单词“ 2014”的示例:
(?>[^2]+|2(?!014))*
年份相同(四位数):
(?>[^0-9]+|[0-9](?![0-9]{3}-))*
另一种方法是先行拆分字符串:
string.split(/(?=\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\s+[AP][M]:)/)
注意:对于这三种模式,您可以选择如何在超前断言中指定子模式的长度和精度。
字符类不能这样工作。
[^\\d{4}]*
含义:
^ - Negative class, so -
\d - Not digit 0-9
{ - Not '{'
4 - Not '4'
} - Not '}'
并且,该类可以选择多次匹配此设置。
因此,它将停止,并且将不匹配一个Not digit 0-9
匹配直到一个四位数的单词也可能像这样
( # (1 start)
( # (2 start)
\d{4} - \d{2} - \d{2}
\s+
\d{2} \: \d{2} \: \d{2}
\s+
[AP] [M]
) # (2 end)
\: \s
( .*? ) # (3)
\: \s
( # (4 start)
(?:
(?! \d{4} ) # Not 4 digits ahead of this character
. # Ok, match the character
)*
) # (4 end)
) # (1 end)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.