我有这个正则表达式在我的iRC频道中提取聊天的名称以及日期和消息捕获组
^\[(?:\d+)\-(?:\d+)(?:\-\d+) @ (\d+):\d+(?::\d+).\d+ (?:GMT|BST)\] (([^:]+)|\[[^\]]): ((?!\!).*)
它适用于这个聊天线,它会给我'bearwolf3'这就是我想要的第二个捕获组
[04-04-2017 @ 12:45:39.204 BST] bearwolf3: Break Fast
但如果这一行显示,我希望能够从我的机器人的中继IRC消息中提取'bladey2k14'的名称,如果它包含[和]
[04-04-2017 @ 12:45:22.338 BST] loonycrewbot: [bladey2k14]: tyt romani :)
所以第二次捕获将是'bladey2k14'
我已经看过if / then / else的例子,但它不适合我使用并让我的大脑受伤!
任何人都可以在顶部修改我的正则表达式吗?
你可以看到它here。我想比赛2将第2组作为bladey2k14,第3组作为消息'tyt romani'
答案 0 :(得分:1)
您可以尝试使用以下表达式:
^\[\d+-\d+-\d+ @ (\d+):\d+:\d+\.\d+ (?:GMT|BST)\] (?|([^:]+)(?!:\s*\[[^\]]*])|[^:]+:\s*\[([^\]]*)]): ([\w\s]*)
请参阅regex demo
PCRE正则表达式中的branch reset group (?|...|...)
允许在其中使用具有相同编号偏移的不同组。因此,(?|([^:]+)(?!:\s*\[[^\]]*])|[^:]+:\s*\[([^\]]*)])
将匹配([^:]+)
,([^\]]*)
会将值捕获到第2组。
我还删除了不必要的非捕获组(如(?:\d+)
中所示 - 组既没有量化,也没有包含任何替换运算符。)
我更改的部分是(?|([^:]+)(?!:\s*\[[^\]]*])|[^:]+:\s*\[([^\]]*)])
和[\w\s]*
:
(?|([^:]+)(?!:\s*\[[^\]]*])|[^:]+:\s*\[([^\]]*)])
匹配2个替换中的1个:
([^:]+)(?!:\s*\[[^\]]*])
:捕获到第2组(:
)的([^:]+)
以外的一个或多个字符未跟随:
,0 +空格,[
除]
和]
以外的0 +字符(带有负向前瞻(?!:\s*\[[^\]]*])
)|
- 或[^:]+:\s*\[([^\]]*)]
- 除:
以外的1个字符,后跟:
,0 +空格,[
,除]
之外的0 +字符(再次)第2组,然后是]
。 [\w\s]*
匹配0 +字符/字母/ _
/空格。