需要一个if else for regex

时间:2017-04-04 14:09:20

标签: regex

我有这个正则表达式在我的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'

1 个答案:

答案 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 +字符/字母/ _ /空格。