所以我在正则表达式中遇到了一些不一致的行为
我的正则表达式:
(?<=test\\\\)(.*)(?=\",)
输入字符串:
"test.exe /c echo teststring > \\\\.\\test\\teststring",
当我运行这个时https://Regex101.com https://Regex101.com
我得到了价值teststring
但是当我在 F# 中运行它时
Regex.Match(inputString, "(?<=test\\\\)(.*)(?=\",)")
I get \teststring
后退。我的目标是得到公正teststring
。我不确定我做错了什么。
我使用三引号字符串取得了成功。那么只需要考虑正则表达式转义,而不需要考虑 F# 字符串转义。
let inputString = """test.exe /c echo teststring > \\\\.\\test\\teststring","""
let x = Regex.Match(inputString, """(?<=test\\\\)(.*)(?=\",)""")
“测试字符串”出来了
源中的字符串显示为
(?<=test\\)(.*)(?=",)
如果您不想使用三引号或逐字,则必须在 F# 中编写:
"(?<=test\\\\\\\\)(.*)(?=\\\",)"
F# 中的此字符串使用反斜杠来转义反斜杠和引号字符。一个位置连续有八个反斜杠,这将成为字符串值中的四个实际反斜杠。还有这样的:
\\\"
这会转换为实际字符串值中的一个实际的 \ 和一个实际的 " 。
所以我们最终得到一个字符串值
(?<=test\\\\)(.*)(?=\",)
这是馈送到正则表达式引擎的实际字符串值。与 F# 编译器一样,正则表达式引擎也使用反斜杠来转义字符。这就是为什么任何实际的反斜杠都必须加倍然后再加倍。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)