正则表达式在匹配字符串后获取单词


71

以下是内容:

Subject:
    Security ID:        S-1-5-21-3368353891-1012177287-890106238-22451
    Account Name:       ChamaraKer
    Account Domain:     JIC
    Logon ID:       0x1fffb

Object:
    Object Server:  Security
    Object Type:    File
    Object Name:    D:\ApacheTomcat\apache-tomcat-6.0.36\logs\localhost.2013-07-01.log
    Handle ID:  0x11dc

我需要捕获该行中单词之后的Object Name:单词。哪个是D:\ApacheTomcat\apache-tomcat-6.0.36\logs\localhost.2013-07-01.log

我怎样才能做到这一点?

^.*\bObject Name\b.*$ 匹配-对象名称

Answers:


52

以下应该为您工作:

[\n\r].*Object Name:\s*([^\n\r]*)

工作实例

您所需的匹配项将在捕获组1中。


[\n\r][ \t]*Object Name:[ \t]*([^\n\r]*)

会类似,但不允许出现诸如“等等对象名称:等等”之类的内容,并且如果“对象名称:”之后没有实际内容,请确保不要捕获下一行。


3
但是我需要比赛结果D:\ApacheTomcat\apache-tomcat-6.0.36\logs\localhost.2013-07-01.log不在比赛组中
Chamara Keragala

@CasperNine,为什么?您使用什么语言?
达拉斯

因为正在使用的程序只能捕获匹配结果。我正在使用一种称为logstash的日志管理工具。将您的正则表达式放到该网站regexpal.com上,看看..它与整行都匹配。
Chamara Keragala

2
@CasperNine,这取决于是否支持lookbehinds。试试看,让我知道您的结果:(?<=Object Name:)([^\n\r]*)请参阅此处
达拉斯

2
@CasperNine,您可以尝试与换行符而不是任何空格字符匹配[^\r\n]+(?=\s+Handle ID:)
达拉斯

52

但是我需要比赛结果...不在比赛组中...

对于您要尝试执行的操作,这应该可行。\K重置比赛的起点。

\bObject Name:\s+\K\S+

您也可以为获得Security ID比赛而做同样的事情。

\bSecurity ID:\s+\K\S+

非常感谢您的回答和评论。我+1了。
Chamara Keragala

12
哦太好了。\K+1队友。这就是“答案”。
拉维K Thapliyal

5
\K无法在javascript中工作,还有其他解决方案吗?
吉姆(Jim)

在Notepad ++中,这对我非常有用。我不确定它使用什么正则表达式处理器,但是在进行正则表达式搜索时确实允许\ K。
Mark

regexr说\ K仅适用于PCRE,不适用于javascript,尽管线索不明,但似乎服务器端的东西。
Mixxiphoid

12

你快到了。使用以下正则表达式(启用多行选项)

\bObject Name:\s+(.*)$

完全匹配将是

Object Name:   D:\ApacheTomcat\apache-tomcat-6.0.36\logs\localhost.2013-07-01.log

而被捕获的第一组将包含

D:\ApacheTomcat\apache-tomcat-6.0.36\logs\localhost.2013-07-01.log

如果要捕获文件路径直接使用

(?m)(?<=\bObject Name:).*$

我想要完整比赛D:\ApacheTomcat\apache-tomcat-6.0.36\logs\localhost.2013-07-01.log吗?
Chamara Keragala

1
@CasperNine是的,可以。更新了正则表达式。
拉维·K·萨普利雅尔

@hwnd是的,没错。但是,这实际上如何工作?如果需要匹配行中的单词Security ID:
怎么办

@CasperNine,您尝试过(?m)(?<=\bObject Name:).*$吗?
拉维K Thapliyal

1
@CasperNine,我想你不可能修剪它,但是几乎所有的正则表达式引擎都不支持可变长度的后向查找。您可以使用,(?m)(?<=\bObject Name:\s{4}).*$但对于其他用户来说却会失败,Security ID:因为空白量会有所不同。
拉维·K·萨普利雅尔

7

根据您使用的语言,这可能对您有用:

(?<=Object Name:).*

这是断言的积极回溯。在这里可以找到更多信息。

不过,它不适用于JavaScript。在您的评论中,我读到您正在将它用于logstash。如果将GROK解析用于logstash,则它将起作用。您可以在这里自己验证:

https://grokdebug.herokuapp.com/

在此处输入图片说明


-3

这是一个Python解决方案。

import re

line ="""Subject:
    Security ID:        S-1-5-21-3368353891-1012177287-890106238-22451
    Account Name:       ChamaraKer
    Account Domain:     JIC
    Logon ID:       0x1fffb

Object:
    Object Server:  Security
    Object Type:    File
    Object Name:    D:\ApacheTomcat\apache-tomcat-6.0.36\logs\localhost.2013-07-01.log
    Handle ID:  0x11dc"""



regex = (r'Object Name:\s+(.*)')
match1= re.findall(regex,line)
print (match1)

*** Remote Interpreter Reinitialized  ***
>>> 
['D:\\ApacheTomcat\x07pache-tomcat-6.0.36\\logs\\localhost.2013-07-01.log']
>>> 

-3

这是一个快速的Perl脚本,可以满足您的需求。它需要一些空白。

#!/bin/perl

$sample = <<END;
Subject:
  Security ID:        S-1-5-21-3368353891-1012177287-890106238-22451
  Account Name:       ChamaraKer
  Account Domain:     JIC
  Logon ID:       0x1fffb

Object:
  Object Server:  Security
  Object Type:    File
  Object Name:    D:\\ApacheTomcat\\apache-tomcat-6.0.36\\logs\\localhost.2013- 07-01.log
  Handle ID:  0x11dc
END

my @sample_lines = split /\n/, $sample;
my $path;

foreach my $line (@sample_lines) {
  ($path) = $line =~ m/Object Name:([^s]+)/g;
  if($path) {
    print $path . "\n";
  }
}

正则表达式不是python
Michael Cole,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.