2010-09-15 15 views
49

Próbuję dopasować początek ciągów w f #. Nie jestem pewien, czy muszę traktować je jako listę znaków, czy co. Wszelkie sugestie będą mile widziane.Dopasowywanie wzorca na początku ciągu w f #

Oto psuedo wersja kod co próbuję zrobić

let text = "The brown fox.." 

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

Tak, chcę patrzeć na początku łańcucha i meczu. Uwaga Nie pasuję do listy ciągów, właśnie napisałem powyższe jako ideę istoty tego, co próbuję zrobić.

Odpowiedz

84

Parametryzowane active patterns na ratunek!

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" 
+0

+1. Świetny przykład aktywnych wzorów dla nas chcących się uczyć! –

+1

Ta odpowiedź ma piękne zastosowanie kompozycji aktywnych wzorów do dopasowywania ciągów znaków: http://stackoverflow.com/questions/3686199/f-pattern-composition/3686555#3686555 –

+0

Ta odpowiedź jest fantastyczna, ale muszę przyznać, że jestem zagubiony . Skąd pochodzi wartość "odpoczynku" w wyrażeniu dopasowania? –

12

Tak, musisz traktować je jako listę znaków, jeśli chcesz użyć wyrażenia dopasowania.

Wystarczy przekształcić ciąg z:

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

Następnie można użyć wyrażenia mecz, ale trzeba będzie używać znaków (typu elementów na liście) dla każdej litery:

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

Jak sugeruje Brian Sparametryzowane aktywne wzorce są o wiele ładniejsze, istnieje kilka przydatnych wzorów here (przejdź na koniec strony).

+0

Chociaż wolę odpowiedź Briana stosując aktywne wzory, zastanawiam się, czy ten może być bardziej skuteczne, jeśli możliwe prefiksy są tylko nieliczne nie długo. Wszelkie spostrzeżenia na ten temat? –

+0

Musisz utworzyć tymczasową tablicę i listę F #, a więc możliwie wiele obiektów, które zwiększą nacisk na GC. To wcale nie jest optymalne. Lepiej użyj dwóch 'StartsWith' lub' StartsWith' + AP. – Stringer

+3

Ponieważ łańcuchy są już 'char seq', możesz po prostu użyć' Seq.toList'. – YotaXP

11

Można również użyć osłony na wzór:

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

To również był dobry przykład, szczególnie jeśli chcesz dopasować częściowo na przełączniku zawierającym = i parametr. – octopusgrabbus

Powiązane problemy