繁体   English   中英

正则表达式循环解析,带有否定词前瞻

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM