Подтвердить что ты не робот

Regex, чтобы получить слова после соответствующей строки

Ниже приведено содержание:

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.*$ matches - Имя объекта

4b9b3361

Ответ 1

Для вас должно работать следующее:

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

Рабочий пример

Ваше желаемое совпадение будет в группе захвата 1.


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

Было бы похоже, но не допускать такие вещи, как "blah Object Name: blah", а также следить за тем, чтобы не захватывать следующую строку, если нет фактического содержимого после "Имя объекта:"

Ответ 2

Но мне нужен результат совпадения... не в группе соответствия...

Для того, что вы пытаетесь сделать, это должно сработать. \K сбрасывает начальную точку совпадения.

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

Вы можете сделать то же самое для получения соответствия Security ID.

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

Ответ 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:).*$

Ответ 4

Вот быстрый perl script, чтобы получить то, что вам нужно. Нужен небольшой пробел.

#!/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

Это может сработать для вас в зависимости от того, какой язык вы используете

(?<=Object Name:).*

Это положительное утверждение. Более подробную информацию можно найти здесь

Он не будет работать с java script. В вашем комментарии я прочитал, что вы используете его для logstash. Если вы используете разбор GROK для logstash, это сработает. Вы можете проверить себя здесь

https://grokdebug.herokuapp.com/

введите описание изображения здесь

Ответ 6

Это решение 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']
>>>