2016-07-08 2 views
3

Ich verstehe das Konzept des Schreibens regulärer Ausdrücke mit Capturing und nicht-einfangenden Gruppen.Brauchen Sie Informationen über Grok-Muster, die nicht einfangende Gruppe verwenden? (?:)

Ex:

a(b|c) würde ab und ac

a(?:b|c) würde passen ab und ac aber erfassen eine

entsprechen und erfassen Aber wie ist es nützlich, wenn ich ein neues Custom-Grok-Muster mache und was es bedeutet Verwenden Sie nicht erfassende Gruppen.

Mit Blick auf einige bestehende grok Muster wie unten für HOUR:

HOUR (?:2[0123]|[01]?[0-9]) 

Hier können wir die Stunden-Format anzeigen lassen und mit (2[0123]|[01]?[0-9]). Wodurch wird das Grok-Muster hier nicht erfasst? Basierend auf welchen Parametern sollte ich entscheiden, diese (?:subex)

+0

Ich weiß nicht, welche Sprache Sie verwenden, aber ich denke, das ist völlig falsch. 'a (b | c)' nimmt normalerweise 'b' oder' c' (abhängig davon, ob das Muster mit 'ab' oder' ac' übereinstimmt), und 'a (?: b | c)' fängt überhaupt nichts ein. Der Unterschied besteht in der Leistung; Warum etwas erfassen, wenn du es nicht tun musst? – ikegami

+0

Re "* Hier können wir das Stundenformat mit' (2 [0123] | [01]? [0-9]) 'ebenso *" anpassen, keine Überraschung da; Capturing ändert nicht, was ein Muster entspricht. – ikegami

Antwort

4

zu verwenden Der Unterschied zwischen einem Muster mit einer Erfassungsgruppe oder ohne in Grok ist, ob Sie ein Feld erstellen müssen oder nicht.

Das Muster (?:2[0123]|[01]?[0-9]) enthält eine nicht erfassende Gruppe, die nur für Gruppierung Untermustersequenzen verwendet wird. Die (2[0123]|[01]?[0-9]) Regex enthält eine nummerierte Erfassungsgruppe, die den Wert abgleicht und erfasst (= speichert in einigen zusätzlichen Puffer mit ID gleich der Reihenfolge der Erfassungsgruppe im Muster). Beachten Sie, dass auch namens Erfassungsgruppen wie (?<field>2[0123]|[01]?[0-9]) den erfassten Wert einer benannten Gruppe zuweist.

Mit named_captures_only Parametersatz falschen wird a(b|c) regex ab oder ac entspricht und ein bc oder zu einem separaten Feld zuweisen. Wenn Sie eine nicht erfassende Gruppea(?:b|c) verwenden, wird nie ein Feld erstellt, dieser Text wird nur zugeordnet.

Da named_captures_only parameter Standardwert True ist, wird die Differenz zwischen einem numerierten Capturing oder nicht-einfangende Gruppe wird in Grok Mustern entfernt. Daher können standardmäßig nur benannte Erfassungen (wie a(?<myfield>b|c)) zum Erstellen von Feldern verwendet werden.

Ich denke, die Präferenz wird nicht einfangenden Gruppen in gemeinsamen Grok-Mustern gegeben, um nicht von der named_captures_only Parametereinstellung abhängig zu sein.

+0

Der Unterschied zwischen einem Muster mit einer Erfassungsgruppe oder ohne in Grok ist, ob Sie ein Feld erstellen müssen oder nicht. Dies half mir meine Frage zu beantworten und jetzt konnte ich das gleiche in den Matches implementieren. – sruthi

+0

Ich möchte auch die Bedeutung von named_captures_only wissen. Wenn ich eine Reihe von grok-Mustern definiere, würde es nur denen entsprechen, die in der Mustergruppe definiert sind. Das ist was es bedeutet?. – sruthi

+0

Das bedeutet, dass nur benannte Aufnahmen gemacht werden, nummerierte werden ignoriert. –

Verwandte Themen