如何在f#中进行非标准字符串替换



我是F#的新手,想使用它来改变命题逻辑公式字符串的格式:

我想用字符串" next(a("替换" ax",而" a"是[a..z]的元素,而'x'是Capital X'字符。

我发现的所有来源,例如https://www.dotnetperls.com/replace-fs要么由另一个字符串替换字符串,

let s = "a & b & c & aX & !bX"
let sReplaced = s.Replace("X", "next()") // val it : string = "a & b & c & anext() & !bnext()"

在这种情况下,您无法将原始字符放在介于或奏效的情况下,例如。

let sArray = s.ToCharArray()
for c in 0 .. sArray.Length - 1 do
    if sArray.[c] = 'X' then
        sArray.[c-2] <- '('
        sArray.[c] <- ')'
let sArrayResult = new string(sArray) // val sArrayResult : string = "a & b & c &(a) & (b)"

仅允许输出字符串相同的长度。

" a&amp; b&amp; c&amp; ax&amp;!bx"

应替换为

" a&amp; b&amp; c&amp; next(a(&amp;!next(b(

是否有一些令人信服的方法来解决此问题?预先感谢。

您可以使用MatchEvaluator

open System.Text.RegularExpressions
let s = "a & b & c & aX & !bX"
Regex.Replace(s, "([a-z]X)", fun m -> "next(" + m.Value.TrimEnd('X') + ")")
- ;;
val it : string = "a & b & c & next(a) & !next(b)"

对带有公认答案的旧线程的死灵张紧表示歉意,但是使用Regex具有一定的开销,并且使用列表的幼稚迭代解决方案在性能方面可能会有利:

let strXToNext (s : string) =
    let next c a =
        ')' :: c :: '(' :: 't' :: 'x' :: 'e' :: 'n' :: a
    let rec replX a = function
        | [] -> List.rev a
        | c :: 'X' :: cs when c >= 'a' && c <= 'z' ->
            replX (next c a) cs
        | c :: cs -> replX (c :: a) cs
    s |> List.ofSeq
      |> replX []
      |> List.toArray
      |> fun a -> Core.string a

regex.replace是您的朋友:

open System.Text.RegularExpressions
let myReplace s =
    Regex.Replace (s, ".X", fun mat -> sprintf "next(%c)" <| mat.ToString().[0])

您可以将.更改为[a-z]或与您所谓的任意字符。

匹配的任何模式

最新更新