如何在 F# 中将变量字符串转换为二进制值?

问题描述 投票:0回答:1

我是 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。

f# f#-interactive
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# 项目来利用正则表达式代码生成器以获得最大正则表达式性能。)

© www.soinside.com 2019 - 2024. All rights reserved.