如何检查字符串是否仅在F#中包含字母

fah*_*ash 3 f#

我有一个只应包含字母的字符串。要检查我是否编写了以下代码

let isCorrectString(str:string) = 
 let isInRange x = (x > 64 && x < 91 ) || (x > 96 && x < 123) || x = 32
 not (str.Any(fun ch -> not (isInRange (ch :?> int)) ))
Run Code Online (Sandbox Code Playgroud)

我显然在这里使用LINQ的`Any'扩展方法。有没有更好的方法来编写上述代码?

Ree*_*sey 6

如果您只想验证它是正确的,则可以执行以下操作:

let isCorrectString(str:string) = 
    let isInRange x = (x > 64 && x < 91 ) || (x > 96 && x < 123) || x = 32
    let bad = 
        str
        |> Seq.map (fun c -> isInRange(int c))
        |> Seq.exists (fun b -> b = false)
    not bad
Run Code Online (Sandbox Code Playgroud)

请注意,这可能是一个更简单的选择:

let isCorrectString(str:string) = 
    str
    |> Seq.forall (fun c -> System.Char.IsLetter(c) || c = ' ')
Run Code Online (Sandbox Code Playgroud)

或者,如果您愿意:

let isCorrectString(str:string) = 
    str
    |> Seq.tryFind (fun c -> not(System.Char.IsLetter(c) || c = ' '))
    |> Option.isNone
Run Code Online (Sandbox Code Playgroud)

  • 还有`String.forall`,您可以部分地获取`let isCorrectString = String.forall(fun c-&gt; System.Char.IsLetter(c)|| c ='')` (5认同)
  • 同样值得一提的是,Char.IsLetter与查验az + AZ相同。“ IsLetter” [匹配各种非英语字符](http://msdn.microsoft.com/en-us/library/yyxz6h5w(v = vs.110).aspx)(例如,“Dž”, `'ʰ'`,`'ˁ'`)。因此,它比手动检查`(c&gt; ='a'&amp;&amp; c &lt;='z')||相当慢。(c&gt; ='A'&amp;&amp; c &lt;='Z')`。 (2认同)