No creo que haya ningún soporte directo para esto, pero ciertamente puede escribir un patrón activo. Los patrones activos le permiten implementar su propio código que se ejecutará como parte de la coincidencia de patrones y puede extraer & para devolver alguna parte del valor.
El siguiente es un patrón que toma dos parámetros (prefijo y cadena postfija) y tiene éxito si la entrada dada comienza/termina con las cadenas especificadas. El patrón no está completa (puede fallar), por lo que vamos a utilizar la sintaxis |Name|_|
y tendrá que volver valor de la opción:
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
Ahora podemos usar Middle
de coincidencia de patrones (por ejemplo, cuando se utiliza match
):
match "[aaa]" with
| Middle "[" "]" mid -> mid
| all -> all
Véase también http://stackoverflow.com/questions/3722591/pattern-matching-on-the-beginning- of-a-string-in-f – Brian