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

时间:2013-10-05 02:07:27

标签: regex expression regex-negation regex-lookarounds

以下是内容:

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

6 个答案:

答案 0 :(得分:43)

  

但是我需要匹配结果......不在匹配组中......

对于你想要做的事情,这应该有效。 \K重置比赛的起点。

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

您可以执行同样的操作来获取Security ID个匹配项。

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

答案 1 :(得分:37)

以下内容对您有用:

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

Working example

您想要的匹配将在捕获组1中。


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

类似但不允许诸如“blah Object Name:blah”之类的东西,并且如果在“Object Name:”之后没有实际内容,也确保不捕获下一行

答案 2 :(得分:7)

你几乎就在那里。使用以下正则表达式(启用多行选项)

\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:).*$

答案 3 :(得分:2)

根据您使用的语言

,这可能会对您有所帮助
(?<=Object Name:).*

这是一个积极的外观断言。可以找到更多信息here

但它不适用于java脚本。在您的评论中,我读到您正在使用它进行logstash。如果您使用GROK解析进行logstash,那么它将起作用。你可以在这里验证自己

<强> https://grokdebug.herokuapp.com/

enter image description here

答案 4 :(得分:-2)

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

答案 5 :(得分:-2)

这是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']
>>> 
相关问题