所以我在正则表达式中遇到了一些不一致的行为
我的正则表达式:
(?<=test\\\\)(.*)(?=\",)
输入字符串:
"test.exe /c echo teststring > \\\\.\\test\\teststring",
中运行时
但是当我在F#
中运行时,我得到了值teststring
Regex.Match(inputString, "(?<=test\\\\)(.*)(?=\",)")
我回来了\teststring
。我的目标是获得teststring
。我不确定我做错了什么。
答案 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#编译器一样,正则表达式引擎也使用反斜杠来转义字符。这就是为什么任何实际的反斜杠必须加倍然后再加倍。