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

ycl3bljg  于 2022-11-18  发布在  其他
关注(0)|答案(6)|浏览(101)

内容如下:

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.*$匹配项-对象名称

ovfsdjhp

ovfsdjhp1#

但我需要比赛结果......不在比赛组......
对于您尝试做的事情,这应该是可行的。\K重置匹配的起点。

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

您可以使用相同的方法来获取Security ID匹配。

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

deyfvvtc2#

如果您使用的regex引擎不支持\K,则以下方法应该适用:

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

Working example
您所需的匹配项将位于捕获组1中。

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

类似,但不允许出现诸如“blah Object Name:blah”,并确保如果“Object Name:“之后没有实际内容,则不捕获下一行

wdebmtf2

wdebmtf23#

您几乎可以做到这一点。使用以下正则表达式(启用多行选项)

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

完整的匹配将是

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

而被捕获的组1将包含

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

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

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

kyks70gy4#

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

(?<=Object Name:).*

这是一个肯定的lookbehindAssert。可以在here中找到更多信息。
但是它不能和JavaScript一起使用。在你的评论中我读到你在logstash中使用了它。如果你在logstash中使用GROK解析,那么它就可以工作。你可以在这里自己验证一下:


kuarbcqp

kuarbcqp5#

这是一个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']
>>>
o3imoua4

o3imoua46#

下面是一个快速的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";
  }
}

相关问题