3 struct PatternMatch(text:Text, index:Int, captures:[Text])
6 convert(text:Text -> Replacement)
7 return Replacement.from_text(text.replace("@", "@@"))
10 convert(text:Text -> Pat)
11 return C_code:Pat`Pattern$escape_text(@text)`
14 return Pat.from_text("$n")
16 func match(pattern:Pat, text:Text, pos:Int = 1 -> PatternMatch?)
18 if C_code:Bool`Pattern$match_at(@text, @pattern, @pos, (void*)&@result)`
22 func matches(pattern:Pat, text:Text -> Bool)
23 return C_code:Bool`Pattern$matches(@text, @pattern)`
25 func capture(pattern:Pat, text:Text -> [Text]?)
26 return C_code:[Text]?`Pattern$captures(@text, @pattern)`
28 func replace(pattern:Pat, text:Text, replacement:Text, backref="@", recursive=yes -> Text)
29 return C_code:Text`Pattern$replace(@text, @pattern, @replacement, @backref, @recursive)`
31 func translate(replacements:{Pat:Text}, text:Text, backref="@", recursive=yes -> Text)
32 return C_code:Text`Pattern$replace_all(@text, @replacements, @backref, @recursive)`
34 func is_in(pattern:Pat, text:Text -> Bool)
35 return C_code:Bool`Pattern$has(@text, @pattern)`
37 func find_in(pattern:Pat, text:Text -> [PatternMatch])
38 return C_code:[PatternMatch]`Pattern$find_all(@text, @pattern)`
40 func each_match(pattern:Pat, text:Text -> func(->PatternMatch?))
41 return C_code:func(->PatternMatch?)`Pattern$by_match(@text, @pattern)`
43 func for_each(pattern:Pat, text:Text, fn:func(m:PatternMatch), recursive=yes)
44 C_code ` Pattern$each(@text, @pattern, @fn, @recursive); `
46 func map(pattern:Pat, text:Text, fn:func(m:PatternMatch -> Text), recursive=yes -> Text)
47 return C_code:Text`Pattern$map(@text, @pattern, @fn, @recursive)`
49 func split(pattern:Pat, text:Text -> [Text])
50 return C_code:[Text]`Pattern$split(@text, @pattern)`
52 func by_split(pattern:Pat, text:Text -> func(->Text?))
53 return C_code:func(->Text?)`Pattern$by_split(@text, @pattern)`
55 func trim(pattern:Pat, text:Text, left=yes, right=yes -> Text)
56 return C_code:Text`Pattern$trim(@text, @pattern, @left, @right)`
59 func main(text:Text, pattern:Pat, replacement:Text?=none)
61 say(pattern.replace(text, r))
63 say("Matches: $(pattern.find_in(text))")
65 # >> "Hello world".match($Pat'{id}')
66 # >> "...Hello world".match($Pat'{id}')
67 # func main(pattern:Pat, input=(/dev/stdin))
68 # for line in input.by_line()!
69 # skip if not line.has_pattern(pattern)
71 # for match in line.by_pattern(pattern)
72 # say(line.slice(pos, match.index-1), newline=no)
73 # say("\033[34;1m$(match.text)\033[m", newline=no)
74 # pos = match.index + match.text.length
75 # say(line.from(pos), newline=yes)