首页 > 解决方案 > 如何在 f# 中进行非标准字符串替换?

问题描述

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

我想用字符串“next(a)”替换“aX”,'a' 是 [a..z] 的一个元素,'X' 是大写的 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 & b & c & aX & !bX”

应该替换为

“a & b & c & next(a) & !next(b)”

有没有一些方便的方法来处理这个问题?提前致谢。

标签: f#f#-interactive

解决方案


您可以使用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)"

推荐阅读