我是 F# 新手,并且尝试这样做已经有一段时间了。所以我有一个看起来像“!p & !q & r & !s”的字符串。我现在应该将其转换为二进制值,即,当它遇到 !p 时,它应该输出值 0,当它遇到 p 时,它应该输出值 1。q、r 和 s 也是如此。因此,“!p & !q & r & !s”应该给出值 0010,而“p & q & !r & s”应该给出值 1101,对于所有可能的组合,依此类推。不知道如何在 F# 中有效地完成此操作。
所以我尝试只为一个变量写这样的东西,但它看起来真的很愚蠢。
let app = "(!p)"
if app.Contains("!p") then printfn "0"
if app.Contains("p") && app.[app.IndexOf("p")-1] <> '!' then printfn "1"
编辑:这不需要任何复杂的解析器。它应该能够读取字符串,忽略 &,( 和空格,如果变量前缀为 ! else 1,则打印 0。
注释中澄清,对于单个小写字母 s,则需要返回:
!s
-> 0
s
-> 1
并忽略其他一切。
我认为这更容易分两步完成,第一步执行上述操作,然后第二步删除任何不是
0
或 1
的内容。
所以类似
open System.Text.RegularExpressions;
let input = "!p & !q & r & !s"
let passOne = Regex.Replace(input, @"!?[a-z]",
fun m ->
let v = m.Value
if v[0] = '!' then
"0"
else
"1"
)
let passTwo = Regex.Replace(passOne, @"[^01]", "")
printfn "%s" passTwo
Regex.Replace
的重载之一,它接受一个 MatchEvaluator
委托,该委托传递一个 Match
对象并返回一个字符串,并且该字符串用作该匹配的替换。这使得取决于匹配值的替换变得非常容易。
对于生产代码,创建静态
Regex
对象并使用实例方法以避免重复编译相同的正则表达式。 (高级选项使用 C# 项目来利用正则表达式代码生成器以获得最大正则表达式性能。)