use strict;
my $str = '/usr/local/lib/node_modules/stylus/bin/stylus:685
throw err;
^
[Error: /Users/user/path/to/stylus/file/invalid.styl:34:5
30| ==/UserStyle== */
31|
32| @-moz-document regexp("https?://(www\\\\.)?typescriptlang.org/(v2/)?docs.*$"),
33| regexp("https?://(www\\\\.)?(staging-)?typescript\\\\.org/docs/.*$")
34| error("compile error")
-----------^
35|
compile error
] {
fromStylus: true,
lineno: 34,
column: 5,
filename: \'/Users/disk0/git.local/stylus-stylus/static/test/testFiles/invalid.styl\',
stylusStack: \'\',
input: \'/* ==UserStyle==\\n\' +
\'@name TypeScript Docs\\n\' +
\'@description Expands width of code blocks and moves navigation bar fully to the left\\n\' +
\'@version 0.0.12\\n\' +
\'@namespace github.com/disk0/stylus/typescript.org/docs\\n\' +
\'\\n\' +
\'@author disk0 (github.com/disco0)\\n\' +
\'@license MIT\\n\' +
\'\\n\' +
\'@preprocessor stylus\\n\' +
\'\\n\' +
\'@var select CodeFont "Font for code displayed on page." [\\n\' +
\' "Iosevka Extended*",\\n\' +
\' "Iosevka Expanded",\\n\' +
\' "Iosevka Term",\\n\' +
\' "Iosevka",\\n\' +
\'\\n\' +
\' "SemanticHaskell",\\n\' +
\' "SemanticJavascript",\\n\' +
\' "SemanticCode",\\n\' +
\' "Hasklig",\\n\' +
\'\\n\' +
\' "PragmataPro Mono Liga",\\n\' +
\'\\n\' +
\' "monospace"\\n\' +
\']\\n\' +
\'@var number CodeFontSize "Size of code in documentation" [ 14, 1, 500, 1, "px" ]\\n\' +
\'@var number CodeFontWeight "Code font weight" [ 400, 100, 900, 100 ]\\n\' +
\'@var number DocTextWidth "Width of text content in documentation" [ 1000, 300, 5000, 100, "px" ]\\n\' +
\'==/UserStyle== */\\n\' +
\'\\n\' +
\'@-moz-document regexp("https?://(www\\\\\\\\.)?typescriptlang.org/(v2/)?docs.*$"),\\n\' +
\'\\t regexp("https?://(www\\\\\\\\.)?(staging-)?typescript\\\\\\\\.org/docs/.*$")\\n\' +
\' error("compile error")\\n\'
}
';
my $regex = qr/^\[Error: +(?<source_path>(?<file>[^\s\n](?:[^\n:\\]+|\\.)+?)(?::(?<line>\d+)(?::(?<column>\d+)))?) *$/mp;
if ( $str =~ /$regex/g ) {
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