Как сделать нестандартную замену строк в f #? - PullRequest
0 голосов
/ 14 мая 2019

Я новичок в f # и хочу использовать его для изменения формата строки логики высказываний:

Я хочу заменить «aX» на строку «next (a)», где «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)"

Есть ли какой-нибудь удобный способ справиться с этой проблемой? Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 14 мая 2019

Вы можете использовать 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)"
1 голос
/ 14 мая 2019

Regex.Replace ваш друг:

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

Вы можете изменить . на [a-z] или любой другой шаблон, который соответствует тому, что вы называете произвольным символом.

...