use strict;
my $str = '[2022-10-18 07:57:29,897 +0000] INFO [qtp698784309-26] RequestLog: - {"address": "127.0.0.1", "user": "-", "request": "GET /op/123 HTTP/1.1", "response_status": "200", "response_bytes": "321", "referer": "-", "user_agent": "node-fetch/1.0 (+https://github.com/bitinn/node-fetch)", "device_type": "-", "locale": "-"}
';
my $regex = qr/^\[(?<log_time>[^\]]*)\] (?<log_level>[^ ]*) \[(?<log_id>[^ ]*)\] (?<log_req>[^ ]*) (?<log_stash>[^ ]*) (?:[^ ]* \")(?<log_ip>[^ ]*)\"\, (?:[^ ]* \")(?<log_user>[^ ]*)\"\, (?:[^ ]* \")(?<log_method>[^ ]*) (?<log_url>[^ ]*) (?<log_httpver>[^ ]*)\, (?:[^ ]* \")(?<log_response_status>[^ ]*)\"\, (?:[^ ]* \")(?<log_response_bytes>[^ ]*)\"\, (?:[^ ]* \")(?<log_referer>[^ ]*)\"\, (?:[^ ]* )\"(?<log_user_agent>.*?[^\\])\"\, \"(.*?[^\\])\"\: \"(?<log_device>.*?[^\\])\"\, \"(.*?[^\\])\"\: \"(?<log_locale>.*?[^\\])\"\}/mp;
if ( $str =~ /$regex/ ) {
print "Whole match is ${^MATCH} and its start/end positions can be obtained via \$-[0] and \$+[0]\n";
# print "Capture Group 1 is $1 and its start/end positions can be obtained via \$-[1] and \$+[1]\n";
# print "Capture Group 2 is $2 ... and so on\n";
}
# ${^POSTMATCH} and ${^PREMATCH} are also available with the use of '/p'
# Named capture groups can be called via $+{name}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Perl, please visit: http://perldoc.perl.org/perlre.html