在第三个冒号之后和第四个冒号之前匹配一个字符串。如果只有1个冒号,则匹配整个字符串(Regex)

时间:2017-04-28 09:24:43

标签: regex expression

这是一个非常复杂的正则表达式(也许对我而言)所以我希望我的解释会很清楚。

规格:

  • 在方括号后计算第一个冒号

    [1234]:< - 这是第一个冒号

  • 在第3个冒号之后和第4个冒号之前匹配一个字符串

    [1234]: abc : 0 : xyz :< - 它将匹配xyz,因为它位于第3个冒号之后和第4个冒号之前

  • 如果在第一个之后没有另一个冒号,它将在方括号后的第一个冒号后匹配整个字符串 [1234]: abc def ghi< - 它将匹配第一个冒号后的整个字符串abc def ghi,因为它没有另一个冒号。

以下几个例子:

  

xxxx [2114]:debug:0:ABC :: CheckIdleTimeout():slot = 2 0x00000000 RC_OK

应仅匹配 ABC

  

xxxx [13312]:info:0:用户登录:admin:xx.xxx.xx.xx / 123

应仅匹配用户登录

  

xxxx [12898]:pam_unix(sshd:session):为用户admin打开的会话

应仅为用户管理

打开会话

  

xxxx [12898]:来自xx.xxx.xx.xx端口123的管理员接受的密码

在冒号来自xx.xxx.xx.xx端口123的管理员的接受密码后,应匹配整个字符串

==

我目前可能没有帮助,但也许它可以成为你的起点。

\[(.*?)\]:\s(\w.*)

它只匹配[xxxx]:

之后的字符串

我正在使用ruby正则表达式。

2 个答案:

答案 0 :(得分:0)

试试这个正则表达式:

^(?:[^:]+:){3}([^:]+?(?:$|:))|^(?:[^:]+:)([^:]+$)

它返回第一个和第二个捕获组中所需的子串。如何访问这些组取决于您使用的语言。

演示:https://regex101.com/r/6jWZlX/2

答案 1 :(得分:0)

正则表达式有点复杂,因为它必须一次匹配完全不同的情况:

^.*?\[.*?\]:(?:[^:]*?:[^:]*?: *([^:]*?) *(?=$|:).*| *([^:]*?) *)$

捕获组是\ 1和\ 2。您可以使用它们的串联,因为它们是互斥的。 See demo

Here关于rubular。