57 votes

Correspondance de modèle au début d'une chaîne en f #

J'essaie de faire correspondre le début des chaînes dans f #. Pas sûr si je dois les traiter comme une liste de personnages ou quoi. Toute suggestion serait appréciée.

Voici une version de code psuedo de ce que j'essaie de faire

 let text = "The brown fox.."

match text with
| "The"::_ -> true
| "If"::_ -> true
| _ -> false
 

Donc, je veux regarder le début de la chaîne et la correspondance. Notez que je ne fais pas correspondre sur une liste de chaînes, mais que ce qui précède est une idée de l’essence de ce que j’essaie de faire.

95voto

Brian Points 82719

Modèles actifs paramétrés à la rescousse!

 let (|Prefix|_|) (p:string) (s:string) =
    if s.StartsWith(p) then
        Some(s.Substring(p.Length))
    else
        None

match "Hello world" with
| Prefix "The" rest -> printfn "Started with 'The', rest is %s" rest
| Prefix "Hello" rest -> printfn "Started with 'Hello', rest is %s" rest
| _ -> printfn "neither"
 

16voto

trgt Points 71

Vous pouvez également utiliser une garde sur le motif:

 match text with
| txt when txt.StartsWith("The") -> true
| txt when txt.StartsWith("If") -> true
| _ -> false
 

12voto

Stringer Points 7273

Oui, vous devez les traiter comme une liste de caractères si vous souhaitez utiliser une expression de mise en correspondance.

Simplement transformer la chaîne avec:

let text = "The brown fox.." |> Seq.toList

Ensuite, vous pouvez utiliser une expression de mise en correspondance, mais vous devrez utiliser des caractères (le type d'éléments dans la liste) pour chaque lettre:

match text with
| 'T'::'h'::'e'::_ -> true
| 'I'::'f'::_ -> true
| _ -> false

Comme Brian suggèrent Paramétrée Active Modèles sont beaucoup plus agréables, il y a un certains modèles utiles ici (aller à la fin de la page).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X