use strict;
my $str = '
return all strings (a-zA-Z0-9) of any length that
start right after one of the following expressions: "WHERE ", "AND ", "OR ", "WHERE (", "AND (", "OR (" and
end right before one of the following expressions: "=", ">", "<", "LIKE", "NOT")
all these expressions should be case-insensitive.
I was playing around with the following online regex-tester: https://www.phpliveregex.com/#tab-preg-match-all. However, the closest I got was this, as I dont know how to get multiple matches:
preg_match_all(\'/^[where|and|or|\\(]* ([a-zA-Z0-1]*)[ |=|<|<=|>|>=|or|in]*.*$/\', $input_lines, $output_array);
Some example SQL-queries:
SHOULD RETURN
WHERE var1=1 AND var2=1 => var1; var2
WHERE var2 IN (1, 2, 3) OR var3=2 => var2; var3
WHERE (var4 like \'%test%\' and var5 NOT LIKE \'%test%\') => var4; var5
WHERE var6 = \'test\' AnD var7=\'test2\' => var6; var7';
my $regex = qr~(?:(?i)WHERE|AND|OR) \(?([a-zA-Z0-9]+)~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