regex that matches an 'if' with no 'then' in line
BlitzMax Forums/BlitzMax Programming/regex that matches an 'if' with no 'then' in line
| ||
| Hi, I'm to stupid. I need a regex that matches a line if there is an 'if' in line but only if no 'then' follows. eg. if blabla -> matches if blabal then blub -> matches not if blathen -> matches I tried ^\s*if.*(?!\s*then) but that matches alway an if is in line ^\s*if\b(?!\s*then) but that woks only if nothing is between if and then thx |
| ||
| the .* means 'anything, any number of characters', it might already group the 'then' portion by that statement? Note that different regex parsers have slightly different rules -- what program or library are you attempting to use this regular expression with? |
| ||
| I'm using Brucey's regex module which uses the open-source PCRE library by Philip Hazel. Yes the .* just includes the 'then'. But how to avoid this? |
| ||
| Don't know if that is "PCRE"-compatible, but PREG-conform is: ^(?!.*then).*if.*$ or for "blathen" ^(?!.*[ \t]then[ \t]).*if.*$ The first part is a negative look-ahead. It first checks if the given string contains a "then", afterwards it is looking for a "if". edit: sample code in php (with a further improved regex)
<?php
$stringA = "if blabla";
$stringB = "if blabal then blub";
$stringC = "if blathen";
$stringD = "if thenbla";
$stringE = "if then\n";
//regex fitting UNZ requirements
$regex = "/^(?!.* then).*if.*$/";
//regex fitting UNZ + "if thenbla"
$regex = "/^(?!.* then .?).*if.*$/";
//regex fitting UNZ + "if thenbla" + allowing tabulator
$regex = "/^(?!.*[ \t]then[ \t].?).*if.*$/";
print "\nresults for stringA [ ".$stringA." ]: ";
preg_match($regex, $stringA, $results);
if(!empty($results)) { print "match"; }
print "\nresults for stringB [ ".$stringB." ]: ";
preg_match($regex, $stringB, $results);
if(!empty($results)) { print "match"; }
print "\nresults for stringC [ ".$stringC." ]: ";
preg_match($regex, $stringC, $results);
if(!empty($results)) { print "match"; }
print "\nresults for stringD [ ".$stringD." ]: ";
preg_match($regex, $stringD, $results);
if(!empty($results)) { print "match"; }
print "\nresults for stringE [ ".str_replace("\n", '\n', $stringE)." ]: ";
preg_match($regex, $stringE, $results);
if(!empty($results)) { print "match"; }
?>
output results for stringA [ if blabla ]: match results for stringB [ if blabal then blub ]: results for stringC [ if blathen ]: match results for stringD [ if thenbla ]: match results for stringE [ if then\n ]: match edit2: included tabulator as space-character. bye Ron |
| ||
| Works perfectly. thx |