2017-02-01 8 views
1

я с throble в регулярное выражение ввода, например:матч Regex, если существует или игнорировать

/aaaa/admin.php?file=xpto.js&version=abcd123 
/aaaa/admin.php 

Выход 1 -

url => /aaaa/admin.php 
var => file=xpto.js&version=abcd123 

Выход 2 -

url => /aaaa/admin.php 

я попытался %{NOTSPACE:url}(?:/?%{NOTSPACE:var}) и другие, но не обработанные

ответ

1

Вы можете использовать

%{URIPATH:path}(?:%{URIPARAM:param})? 

Модели представлены в https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns.

%{URIPATH:path} будет соответствовать пути, в то время как (?:%{URIPARAM:param})? будет соответствовать 1 или 0 вхождений (из-за дополнительного без захвата группы (?:...)?) из строки запроса.

Если вам нужно избавиться от ? в param, вы можете также использовать

(?<path>(?:/[A-Za-z0-9$.+!*'(){},~:;[email protected]#%_-]*)+)(?:\?(?<param>[A-Za-z0-9$.+!*'|(){},[email protected]#%&/=:;_?\[\]-]*))? 

Выходной сигнал для /aaaa/admin.php?file=xpto.js&version=abcd123 ввода:

{ 
    "path": [ 
    [ 
     "/aaaa/admin.php" 
    ] 
    ], 
    "param": [ 
    [ 
     "?file=xpto.js&version=abcd123" 
    ] 
    ] 
} 

Выход для /aaaa/admin.php:

{ 
    "path": [ 
    [ 
     "/aaaa/admin.php" 
    ] 
    ], 
    "param": [ 
    [ 
     null 
    ] 
    ] 
} 
+0

спасибо. работайте отлично на https://grokconstructor.appspot.com/do/match! – Jam

+0

Я также добавил [пользовательское регулярное выражение] (https://regex101.com/r/qnBJer/1) (на основе встроенных шаблонов grok), если вы хотите избавиться от '?' В 'param' стоимость. –

1

Является ли это то, что ищете?

([^\s?]+)(?:\?(\S+))? 

Вы можете проверить его here.

Кроме того, вы можете просто разделить строку URL-адрес на ?