正则表达式选择括号之间和“:”之后的所有文本

时间:2015-06-01 15:25:26

标签: regex

所以我最近一直在学习正则表达式,看来我的新表达方式遇到了障碍。我需要能够选择括号中的所有文本并将它们设置为不同的组。我的表达做了两对中的一对,但我怎么做多个?环视四周?我还想选择“:”之后的语句到行尾,我不知道为什么这不起作用。解释会很棒!

示例在这里: https://regex101.com/r/uV2mD3/2

([\d]{4}-[\d]{2}-[\d]{2}\s[\d]{2}:[\d]{2}:[\d]{2},[\d]{3}).+(\b[A-Z]{2,}\b).*\[(‌​\S+)\](?:\s\:\s).+(?=\n|$)

第一组选择日期/时间格式,第二组选择“DEBUG”或“LOG”,第三组和第四组应该是括号([])中的任何内容,第五组选择在“:”之后的任何内容

1 个答案:

答案 0 :(得分:3)

为了更好的可读性,您可以使用允许您编写多行正则表达式的x选项:

https://regex101.com/r/uV2mD3/3

(?x) # X option
(
[\d]{4}-[\d]{2}-[\d]{2}\s* # Date
[\d]{2}:[\d]{2}:[\d]{2}    # Hour
,[\d]{3}                   # Number
)
\s+
(\w+)  # Tag (DEBUG)
\s+    # Some spacing
\[(.*?)\]\s* # First  tag
\[(.*?)\]    # Second tag
\s*:\s*
(.*)   # Last string

如果知道[.*]的数量,您只需在正则表达式中为所有组重复该模式。

如果[...]的数量是可变的,那么这将是一个更复杂的正则表达式。

您还可以使用(?P<name>)命名捕获组,如下所示

(?x)
(?P<date>
[\d]{4}-[\d]{2}-[\d]{2}\s* # Date
[\d]{2}:[\d]{2}:[\d]{2}    # Hour
,[\d]{3}                   # Number
)
\s+
(?P<tag>\w+)  # Tag
\s+    
\[(?P<group1>.*?)\]\s* # First  tag
\[(?P<group2>.*?)\]    # Second tag
\s*:\s*
(?P<last>.*)   # Last string