Я не думаю, что есть прямая поддержка для этого, но вы, конечно, можете написать активный шаблон .Активные шаблоны позволяют вам реализовать собственный код, который будет выполняться как часть сопоставления с шаблоном, и вы можете извлечь и вернуть некоторую часть значения.
Ниже приведен шаблон, который принимает два параметра (префикс и строка постфикса).) и завершается успешно, если заданный ввод начинается / заканчивается указанными строками.Шаблон не завершен (может завершиться ошибкой), поэтому мы будем использовать синтаксис |Name|_|
, и для этого потребуется вернуть значение параметра:
let (|Middle|_|) prefix postfix (input:string) =
// Check if the string starts with 'prefix', ends with 'postfix' and
// is longer than the two (meaning that it contains some middle part)
if input.StartsWith(prefix) && input.EndsWith(postfix) &&
input.Length >= (prefix.Length + postfix.Length) then
// Strip the prefix/postfix and return 'Some' to indicate success
let len = input.Length - prefix.Length - postfix.Length
Some(input.Substring(prefix.Length, len))
else None // Return 'None' - string doesn't match the pattern
Теперь мы можем использовать Middle
в сопоставлении с образцом (например,при использовании match
):
match "[aaa]" with
| Middle "[" "]" mid -> mid
| all -> all