From c72b0406a32ffc3f04324f7b6c321486762fca41 Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Sat, 16 Aug 2025 17:21:01 -0400 Subject: Improved parsing and prefix/suffix matching using a `remainder` parameter --- lib/patterns/patterns.tm | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'lib/patterns/patterns.tm') diff --git a/lib/patterns/patterns.tm b/lib/patterns/patterns.tm index bab0c3dc..c5444b86 100644 --- a/lib/patterns/patterns.tm +++ b/lib/patterns/patterns.tm @@ -10,6 +10,12 @@ lang Pat return Pat.from_text("$n") extend Text + func matching_pattern(text:Text, pattern:Pat, pos:Int = 1 -> PatternMatch?) + result : PatternMatch + if C_code:Bool(Pattern$match_at(@text, @pattern, @pos, (void*)&@result)) + return result + return none + func matches_pattern(text:Text, pattern:Pat -> Bool) return C_code:Bool(Pattern$matches(@text, @pattern)) @@ -45,3 +51,16 @@ extend Text func trim_pattern(text:Text, pattern=$Pat"{space}", left=yes, right=yes -> Text) return C_code:Text(Pattern$trim(@text, @pattern, @left, @right)) + +func main() + >> "Hello world".matching_pattern($Pat'{id}') + >> "...Hello world".matching_pattern($Pat'{id}') +# func main(pattern:Pat, input=(/dev/stdin)) +# for line in input.by_line()! +# skip if not line.has_pattern(pattern) +# pos := 1 +# for match in line.by_pattern(pattern) +# say(line.slice(pos, match.index-1), newline=no) +# say("\033[34;1m$(match.text)\033[m", newline=no) +# pos = match.index + match.text.length +# say(line.from(pos), newline=yes) -- cgit v1.2.3