我正在尝试使用正则表达式来解析聊天记录(即Skype消息)。因此,我正在使用的正则表达式正确匹配Skype日志....只要他们没有新行。
所以我尝试将s
修饰符添加到最后,但这现在使它匹配所有内容(因为它现在是多行)。所以我想知道是否有办法允许多行,但在Skype消息开头的[
之前停止。
我的正则表达式在这里:https://regex101.com/r/nL0vO9/1
答案 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)