String matching: Difference between revisions
Content added Content deleted
(→{{header|MATLAB}} / {{header|Octave}}: String matching) |
(Added Bracmat example) |
||
Line 167: | Line 167: | ||
"The fox jumps over the dog" contains "dog" at position 24 |
"The fox jumps over the dog" contains "dog" at position 24 |
||
"The fox jumps over the dog" contains "dog" 1 time(s)</pre> |
"The fox jumps over the dog" contains "dog" 1 time(s)</pre> |
||
=={{header|Bracmat}}== |
|||
Bracmat does pattern matching in expressions <code><i>subject</i>:<i>pattern</i></code> and in strings <code>@(<i>subject</i>:<i>pattern</i>)</code>. The (sub)pattern <code>?</code> is a wild card. |
|||
<lang>( (sentence="I want a number such that that number will be even.") |
|||
& out$(@(!sentence:I ?) & "sentence starts with 'I'" | "sentence does not start with 'I'") |
|||
& out$(@(!sentence:? such ?) & "sentence contains 'such'" | "sentence does not contain 'such'") |
|||
& out$(@(!sentence:? "even.") & "sentence ends with 'even.'" | "sentence does not end with 'even.'") |
|||
& 0:?N |
|||
& ( @(!sentence:? be (? & !N+1:?N & ~)) |
|||
| out$str$("sentence contains " !N " occurrences of 'be'") |
|||
) |
|||
)</lang> |
|||
In the last line, Bracmat is forced by the always failing node <code>~</code> to backtrack until all occurrences of 'be' are found. Thereafter the pattern match expression fails. The interesting part is the side effect: while backtracking, the accumulator <code>N</code> keeps track of how many are found. |
|||
Output: |
|||
<lang>sentence starts with 'I' |
|||
sentence contains 'such' |
|||
sentence ends with 'even.' |
|||
sentence contains 3 occurrences of 'be'</lang> |
|||
=={{header|C}}== |
=={{header|C}}== |