正则表达式匹配多行聊天消息

时间:2015-06-12 20:37:45

标签: regex

我正在尝试使用正则表达式来解析聊天记录(即Skype消息)。因此,我正在使用的正则表达式正确匹配Skype日志....只要他们没有新行。

所以我尝试将s修饰符添加到最后,但这现在使它匹配所有内容(因为它现在是多行)。所以我想知道是否有办法允许多行,但在Skype消息开头的[之前停止。

我的正则表达式在这里:https://regex101.com/r/nL0vO9/1

2 个答案:

答案 0 :(得分:1)

您可以使用tempered greedy Token

\[(?:(?!\n\[).)*

注意你还需要包含g修饰符,这样你就不会在第一场比赛中停止

请参阅Demo

就像@sln指出的那样,如果你想保留新行,请改用:

\[(?:.(?<!\n\[))*

答案 1 :(得分:0)

将标志设置为//mg多行和全局。不要使用s Dot all标志 编辑:如果您不关心验证/解析时间/名称/消息部分,我想您可以使用更简单的东西。 @CrayonViolent或@RodrigoLópez应该为此工作。

 # ^\[([^\r\n\]]*)\]([^:\r\n]*):((?:(?!^\[).*(?:\r?\n)*)*)

 ^                             # BOL
 \[ 
 ( [^\r\n\]]* )                # (1), Time
 \] 
 ( [^:\r\n]* )                 # (2), Person
 :  
 (                             # (3 start), Message
      (?:                           # Cluster group
           (?! ^ \[ )                    # Assert, not BOL and [
           .*                            # Get all to end of line
           (?: \r? \n )*                 # Optional, Get 1 to many line-breaks
      )*                            # End cluster, do 1 to many times
 )                             # (3 end)