正则表达式抓住前面的角色

时间:2017-04-06 17:38:28

标签: regex f#

所以我在正则表达式中遇到了一些不一致的行为

我的正则表达式:

(?<=test\\\\)(.*)(?=\",)

输入字符串:

"test.exe /c echo teststring > \\\\.\\test\\teststring",

当我在https://Regex101.com

中运行时

但是当我在F#

中运行时,我得到了值teststring
Regex.Match(inputString, "(?<=test\\\\)(.*)(?=\",)")

我回来了\teststring。我的目标是获得teststring。我不确定我做错了什么。

1 个答案:

答案 0 :(得分:4)

我使用三引号字符串成功了。然后只需要考虑正则表达式转义,而不是F#字符串转义。

let inputString = """test.exe /c echo teststring > \\\\.\\test\\teststring","""
let x = Regex.Match(inputString, """(?<=test\\\\)(.*)(?=\",)""")

“teststring”出来

源代码中的字符串显示为

(?<=test\\)(.*)(?=",)

如果您不想使用三重引号或逐字逐句,则必须在F#中编写:

"(?<=test\\\\\\\\)(.*)(?=\\\",)"

F#中的这个字符串使用反斜杠来转义反斜杠和引号字符。在一个地方连续有八个反斜杠,然后在字符串值中变为四个实际的反斜杠。还有这个:

\\\"

转换为实际字符串值中的一个实际\和一个实际值。

然后我们最终得到一个字符串值

(?<=test\\\\)(.*)(?=\",)

这是输入正则表达式引擎的实际字符串值。正如F#编译器一样,正则表达式引擎也使用反斜杠来转义字符。这就是为什么任何实际的反斜杠必须加倍然后再加倍。