Я думаю, что мой ответ здесь на предыдущий вопрос может помочь вам немного лучше понять соответствие шаблону.
Однако, для того, что вы пытаетесь сделать, я бы, вероятно, придерживался простых выражений if / then / else:
let y x =
if x.Contains("hi") then "HELLO"
elif x.Contains("hello") then "HI"
else x
Создание специального Contains
активного шаблона, такого как @Tomas Petricek, также является вариантом, но я считаю, что если я действительно собираюсь выполнить какое-то серьезное сопоставление с строковым шаблоном, то я просто придерживаюсь пары верных регулярных выражений активных шаблонов. :
open System.Text.RegularExpressions
///Match the pattern using a cached interpreted Regex
let (|InterpretedMatch|_|) pattern input =
if input = null then None
else
let m = Regex.Match(input, pattern)
if m.Success then Some [for x in m.Groups -> x]
else None
///Match the pattern using a cached compiled Regex
let (|CompiledMatch|_|) pattern input =
if input = null then None
else
let m = Regex.Match(input, pattern, RegexOptions.Compiled)
if m.Success then Some [for x in m.Groups -> x]
else None
и для этой проблемы используйте их так:
let y = function // shorthand for let y x = match x with ...
| CompiledMatch @"hi" _ -> "HELLO"
| CompiledMatch @"hello" _ -> "HI"
| x -> x
Мне это нравится, потому что он с легкостью охватывает Contains, StartsWith, EndsWith, Equals и далее:
let y = function
| CompiledMatch @"^hi$" _ -> "Equals"
| CompiledMatch @"^hi" _ -> "StartsWith"
| CompiledMatch @"hi$" _ -> "EndsWith"
| CompiledMatch @"leadinghiending" _ -> "Beyond"
| CompiledMatch @"hi" _ -> "Contains"
| x -> x
(обратите внимание, что буквенные строки, введенные @, на самом деле не нужны ни для одного из этих примеров регулярных выражений, но я всегда использую их, так как они вам нужны чаще, чем с регулярными выражениями).