正则表达式将用户ID与逗号匹配

时间:2019-10-12 03:37:17

标签: regex

我将用户ID与regex(在Splunk中)匹配,并遇到了混合结果:

正则表达式 ^[^=\n]*

https://regexr.com/4mn3d

Splunk提取 ^[^=\n]*=(?P<user>[^ ]+)

规则/测试数据

  • firstname.lastname
  • A123456
  • 域名\名字。姓氏
  • 域名\ A123456
  • 姓,名
  • 姓氏,名字首字母

日志样本

Oct 3 23:33:00 2019 wc1 authmgr[4111]: <522008> <4904> <NOTI> <wc1 123.134.128.122> User Authentication Successful: username=lastname, firstname MAC=d0:c6:25:79:e7:c6 IP=192.168.16.26 role=Authenticated VLAN=600 AP=43:4a:e3:c9:ec:0c SSID=corpnet AAA profile=aaaprof auth method=802.1x auth server=authserv

Oct 3 22:42:27 2019 wc1 authmgr[4111]: <522008> <4111> <NOTI> <wc1 123.134.128.122> User Authentication Successful: username=lastname, firstname initial MAC=b2:09:cf:4c:80:1e IP=192.168.16.27 role=Authenticated VLAN=600 AP=34:fc:b2:c1:be:dc SSID=corpnet AAA profile=aaaprof auth method=802.1x auth server=authserv

期望

username=lastname, firstname

username=lastname, firstname initial

匹配在regex.com上有效,但lastname, firstname在Splunk中不匹配。似乎当前的正则表达式在逗号处停止。

2 个答案:

答案 0 :(得分:1)

您的Regex在一个地方而不是另一个地方工作的原因可能是由于regexr.com和Splunk中使用的Regex风格/引擎不同。

以下正则表达式适用于您的用例:
^[^=]*=([^=]*)(?=\s)

但是,用户名不能包含等号以使Regex正常工作。这可以通过将用户输入清理为字母数字以及指定的特殊字符(“。”,“ \”,空格)等来实现。

const logEntries = `Oct  3 23:33:00 2019 wc1 authmgr[4111]: <522008> <4904> <NOTI> <wc1 123.134.128.122>  User Authentication Successful: username=lastname, firstname MAC=d0:c6:25:79:e7:c6 IP=192.168.16.26 role=Authenticated VLAN=600 AP=43:4a:e3:c9:ec:0c SSID=corpnet AAA profile=aaaprof auth method=802.1x auth server=authserv

Oct  3 22:42:27 2019 wc1 authmgr[4111]: <522008> <4111> <NOTI> <wc1 123.134.128.122>  User Authentication Successful: username=lastname, firstname initial MAC=b2:09:cf:4c:80:1e IP=192.168.16.27 role=Authenticated VLAN=600 AP=34:fc:b2:c1:be:dc SSID=corpnet AAA profile=aaaprof auth method=802.1x auth server=authserv`;

let result;

logEntries.split(/\n/).map((entry) => {
  result = entry.match(/^[^=]*=([^=]*)(?=\s)/);

  if (result) {
    console.log(result[1]);
  }
});

在上面的示例中,请注意,我首先将日志分成单独的条目,然后分别对每个条目进行正则表达式匹配。

正则表达式的解释:

^-在行的开头声明位置
[^=]-匹配任何非文字等号(=)
*-零到无限次匹配
=-与文字等号匹配
([^=]*)-与任何非文字等号匹配的捕获组
(?=\s)-一个积极的前瞻性断言,字符串中当前位置之后紧跟的是空格字符

答案 1 :(得分:1)

不确定我能很好地理解您的需求,但这就是您想要的:

(\w+)=(.+?)(?=\s\w+=|$)

Demo & explanation