【问题标题】:Regex match User ID with comma's正则表达式将用户 ID 与逗号匹配
【发布时间】:2019-10-12 20:55:53
【问题描述】:

我正在将用户 ID 与正则表达式(在 Splunk 中)匹配并且遇到了混合结果:

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

https://regexr.com/4mn3d

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

规则/测试数据

  • 名.姓
  • 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 中不匹配。似乎当前的正则表达式在逗号处停止。

【问题讨论】:

  • 没有示例数据很难提供帮助。您的代码看起来像是在期待“name=value”,但您的测试数据都没有。请edit您的问题提供实际示例输入数据和预期输出数据。我们需要一个minimal reproducible example
  • 它不会在逗号处停止,它会在第一个空格处停止(lastname, 之后)
  • 抱歉,没错。

标签: regex


【解决方案1】:

您的正则表达式在一个地方工作但在另一个地方不能工作的原因可能是由于regexr.com 和 Splunk 中使用了不同的正则表达式风格/引擎。

以下正则表达式应该适用于您的用例:
^[^=]*=([^=]*)(?=\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]);
  }
});

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

正则表达式的解释:

^ - 在行首断言位置
[^=] - 匹配任何非等号 (=)
* - 匹配零次到无限次
@987654328 @ - 匹配文字等号
([^=]*) - 匹配任何非文字等号的捕获组
(?=\s) - 肯定的前瞻断言紧跟在字符串中当前位置之后的是空格字符

【讨论】:

  • 谢谢。我在 Splunk 中也试过这个,但同样的情况,在第一个空格之后(姓氏之后)停止。您的演示看起来是正确的...
  • @pablo808 难道“姓氏”后面的字符实际上不是空格?尝试将日志中的文本直接粘贴到显示不可打印字符的工具中:soscisurvey.de/tools/view-chars.php 空格字符将由代码“0x20”表示。
【解决方案2】:

不确定我是否完全理解您的需求,但这是否是您想要的:

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

Demo & explanation

【讨论】:

  • 即使您的演示工作正常并且显示正确,在 Splunk 中,在第一个空格(姓氏之后)之后停止。
  • @pablo808:可能是 Splunk 不支持前瞻。试试(\w+)=(.+?)(\s|$)(\w+)=(.+?)(?:\s|$)
  • 不高兴。我想你可能是对的。还是要谢谢你的帮助。真的很感激。
  • @pablo808:是否有一些错误日志或类似内容可以解释为什么它不起作用?
猜你喜欢
  • 2021-07-31
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多