逃避星号抓住错误的角色

时间:2017-04-13 21:29:50

标签: regex f#

当我运行下面的代码时,我会得到意外的结果\*也会捕获É。有没有办法让它只捕获*,就像我想要的那样?

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

1 个答案:

答案 0 :(得分:1)

你是对的,你需要使用积极的前瞻而不是消极的前瞻来获得你想要的结果。但是,为了澄清注释中出现的问题,在F#中,仅由""分隔的字符串不像""分隔的普通C#字符串或{{1}分隔的C#字符串。 - 如果你想要后者,你也应该在F#中使用@""。区别在于,在普通的F#字符串中,当在有效字符前面使用反斜杠时,反斜杠将被视为转义序列 (参见Strings (F#)顶部的表格)。否则,它被视为字面反斜杠字符。因此,由于@""不是要转义的有效字符,您很幸运地看到了您期望的行为(相比之下,在C#中,这将是语法错误,因为它是一个无法识别的转义)。我建议您不要依赖此,而应使用逐字'*'字符串。

换句话说,在F#中,以下三个字符串都是等价的:

@""

我认为C#设计更加明智,因为它可以防止对正在被转义的内容产生混淆。