Regex, um die Wörter nach dem Abgleichen der Zeichenfolge zu erhalten


71

Unten ist der Inhalt:

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

Ich muss die Wörter nach dem Object Name:Wort in dieser Zeile erfassen . Welches ist D:\ApacheTomcat\apache-tomcat-6.0.36\logs\localhost.2013-07-01.log.

Wie kann ich das machen?

^.*\bObject Name\b.*$ Übereinstimmungen - Objektname

Antworten:


52

Folgendes sollte für Sie funktionieren:

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

Arbeitsbeispiel

Ihr gewünschtes Match befindet sich in Capture-Gruppe 1.


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

Wäre ähnlich, würde aber Dinge wie "bla Objektname: bla" nicht berücksichtigen und auch sicherstellen, dass die nächste Zeile nicht erfasst wird, wenn nach "Objektname:" kein tatsächlicher Inhalt vorhanden ist.


3
Aber ich brauche das D:\ApacheTomcat\apache-tomcat-6.0.36\logs\localhost.2013-07-01.log
Spielergebnis

@ CasperNine, warum? Und welche Sprache benutzt du?
Dallas

weil das Programm, das Captures verwendet, nur mit dem Ergebnis übereinstimmt. Ich benutze ein Protokollverwaltungstool namens logstash. Setzen Sie Ihren regulären Ausdruck auf diese Website regexpal.com und sehen Sie, dass er mit der gesamten Zeile übereinstimmt.
Chamara Keragala

2
@CasperNine, es hängt davon ab, ob dies Lookbehinds unterstützt. Versuchen Sie dies und lassen Sie mich Ihr Ergebnis wissen: (?<=Object Name:)([^\n\r]*)Siehe hier
Dallas

2
@ CasperNine, Sie könnten versuchen, gegen Zeilenumbrüche anstelle von Leerzeichen zu vergleichen ...[^\r\n]+(?=\s+Handle ID:)
Dallas

52

Aber ich brauche das Spielergebnis, um ... nicht in einer Spielgruppe zu sein ...

Für das, was Sie versuchen, sollte dies funktionieren. \Ksetzt den Startpunkt des Spiels zurück.

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

Sie können das Gleiche tun, um Ihre Security IDÜbereinstimmungen zu erhalten.

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

Vielen Dank für Ihre Antworten und Kommentare. Ich habe + 1ed.
Chamara Keragala

12
Oh wie süß. \K+1 Kumpel. Das ist die Antwort.
Ravi K Thapliyal

5
\Kfunktioniert nicht in Javascript, irgendwelche anderen Lösungen?
Jim

Dies hat in Notepad ++ hervorragend funktioniert. Ich bin nicht sicher, welchen Regex-Prozessor er verwendet, aber er erlaubt das \ K bei der Regex-Suche.
Mark

Laut regexr funktioniert \ K nur mit PCRE und nicht mit Javascript. Keine Ahnung, was PCRE ist, scheint jedoch serverseitig zu sein.
Mixxiphoid

12

Du bist fast da. Verwenden Sie den folgenden regulären Ausdruck (mit aktivierter mehrzeiliger Option).

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

Das komplette Match wäre

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

während die erfasste Gruppe eine enthalten würde

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

Wenn Sie den Dateipfad direkt erfassen möchten, verwenden Sie

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

Ich möchte, dass das komplette Match ist. D:\ApacheTomcat\apache-tomcat-6.0.36\logs\localhost.2013-07-01.logKann ich das nicht tun?
Chamara Keragala

1
@CasperNine Ja, das kannst du. Der reguläre Ausdruck wurde aktualisiert.
Ravi K Thapliyal

@hwnd ja das ist richtig. Aber wie funktioniert das eigentlich? Was ist, wenn Wörter übereinstimmen müssen, die in der Zeile stehenSecurity ID:
Chamara Keragala

@ CasperNine, hast du es versucht (?m)(?<=\bObject Name:).*$?
Ravi K Thapliyal

1
@CasperNine, ich denke, es ist nicht möglich, es zu trimmen, aber Look-Behind mit variabler Länge wird bei fast allen Regex-Engines nicht unterstützt. Sie könnten verwenden, (?m)(?<=\bObject Name:\s{4}).*$aber es würde für andere wie fehlschlagen, Security ID:weil die Menge der Leerzeichen variiert.
Ravi K Thapliyal

7

Dies kann für Sie je nach verwendeter Sprache funktionieren:

(?<=Object Name:).*

Es ist ein positiver Blick hinter die Behauptung. Weitere Informationen finden Sie hier .

Mit JavaScript funktioniert es jedoch nicht. In Ihrem Kommentar habe ich gelesen, dass Sie es für Logstash verwenden. Wenn Sie GROK-Parsing für Logstash verwenden, funktioniert dies. Sie können es hier selbst überprüfen:

https://grokdebug.herokuapp.com/

Geben Sie hier die Bildbeschreibung ein


-3

Dies ist eine Python-Lösung.

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

Hier ist ein schnelles Perl-Skript, um das zu bekommen, was Sie brauchen. Es braucht ein paar Leerzeichen.

#!/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";
  }
}

Regex nicht Python
Michael Cole
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.