【问题标题】:Regex to get the words after matching string [duplicate]正则表达式获取匹配字符串后的单词[重复]
【发布时间】:2013-10-12 03:53:08
【问题描述】:

以下是内容:

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

【问题讨论】:

    标签: regex expression regex-negation regex-lookarounds


    【解决方案1】:

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

    对于您正在尝试做的事情,这应该有效。 \K 重置比赛的起点。

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

    您也可以这样做来获取 Security ID 匹配项。

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

    【讨论】:

    • 非常感谢您的回答和 cmets。我已经 +1 了。
    • 哦,亲爱的。 \K +1 队友。这是“那个”答案。
    • \K 无法在 javascript 中工作,还有其他解决方案吗?
    • 这对我在 Notepad++ 中非常有用。我不确定它使用什么正则表达式处理器,但它在进行正则表达式搜索时确实允许 \K。
    • regexr 说 \K 只适用于 PCRE 而不是 javascript,但不知道 PCRE 是什么,似乎是服务器端的东西。
    【解决方案2】:

    以下内容应该适合您:

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

    Working example

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


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

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

    【讨论】:

    • 但我需要匹配结果为D:\ApacheTomcat\apache-tomcat-6.0.36\logs\localhost.2013-07-01.log 不在匹配组中
    • @CasperNine,为什么?你使用什么语言?
    • 因为我使用的程序只捕获匹配结果。我正在使用一个名为logstash 的日志管理工具。将您的正则表达式放到该站点regexpal.com 并查看.. 它与整行匹配。
    • @CasperNine,这取决于它是否支持lookbehinds。试试这个,让我知道你的结果:(?<=Object Name:)([^\n\r]*)here
    • @CasperNine,您可以尝试匹配换行符而不是任何空格字符...[^\r\n]+(?=\s+Handle ID:)
    【解决方案3】:

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

    \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 我不能这样做吗?
    • @CasperNine 是的,你可以。更新了正则表达式。
    • @hwnd 是的,没错。但这实际上是如何工作的?如果需要匹配Security ID:行中的单词怎么办@
    • @CasperNine,你试过(?m)(?&lt;=\bObject Name:).*$吗?
    • @CasperNine,我想你不可能修剪它,但几乎所有的正则表达式引擎都不支持可变长度的后视。您可以使用(?m)(?&lt;=\bObject Name:\s{4}).*$,但对于像Security ID: 这样的其他人来说它会失败,因为空格的数量会有所不同。
    【解决方案4】:

    这可能对您有用,具体取决于您使用的语言:

    (?<=Object Name:).*
    

    这是一个积极的后向断言。更多信息可以在here找到。

    但它不适用于 JavaScript。在您的评论中,我读到您将它用于logstash。如果您使用 GROK 解析 logstash,那么它会起作用。您可以在此处自行验证:

    https://grokdebug.herokuapp.com/

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        这里有一个快速的 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
        猜你喜欢
        • 1970-01-01
        • 2020-06-01
        • 2021-05-23
        • 1970-01-01
        • 2011-12-13
        • 2019-07-21
        • 2023-03-09
        • 2011-09-02
        • 1970-01-01
        相关资源
        最近更新 更多