当我运行下面的代码时,我会得到意外的结果\*
也会捕获É
。有没有办法让它只捕获*
,就像我想要的那样?
let s =
"* A
ÉR
* B"
let result = System.Text.RegularExpressions.Regex.Replace(s, "\n(?!\*)", "", Text.RegularExpressions.RegexOptions.Multiline)
printfn "%s" result
运行后的结果替换
* AÉR
* B
预期结果
"* A
ÉR
* B"
更新
当我使用像\n(?=\*)
这样的模式时,这似乎有效。我想我需要一个positive lookahead
。
答案 0 :(得分:1)
你是对的,你需要使用积极的前瞻而不是消极的前瞻来获得你想要的结果。但是,为了澄清注释中出现的问题,在F#中,仅由""
分隔的字符串不像""
分隔的普通C#字符串或{{1}分隔的C#字符串。 - 如果你想要后者,你也应该在F#中使用@""
。区别在于,在普通的F#字符串中,当在有效字符前面使用反斜杠时,反斜杠将被视为转义序列 (参见Strings (F#)顶部的表格)。否则,它被视为字面反斜杠字符。因此,由于@""
不是要转义的有效字符,您很幸运地看到了您期望的行为(相比之下,在C#中,这将是语法错误,因为它是一个无法识别的转义)。我建议您不要依赖此,而应使用逐字'*'
字符串。
换句话说,在F#中,以下三个字符串都是等价的:
@""
我认为C#设计更加明智,因为它可以防止对正在被转义的内容产生混淆。