无法在 C# 中使用 Regex.Unescape 删除转义序列

Posted

技术标签:

【中文标题】无法在 C# 中使用 Regex.Unescape 删除转义序列【英文标题】:Unable to remove Escape sequences using Regex.Unescape in C# 【发布时间】:2021-10-19 22:53:51 【问题描述】:

我想从 Pokemon API 获得的以下字符串中删除所有转义序列。

“一粒奇怪的种子\n在出生时\n种在它的背上。\f植物发芽\n并与\n这只 POKéMON 一起生长。”

我使用过Regex.Unescape("A strange seed was\nplanted on its\nback at birth.\fThe plant sprouts\nand grows with\nthis POKéMON."),但得到的是相同的字符串。

输出

你能帮我解决这个问题吗?

我不想进行字符串替换,因为在下一次 API 调用中转义序列可能会有所不同。

【问题讨论】:

您的原始字符串不包含任何转义字符。它包含换行符,在字符串文字中转义为\n,然后由调试器转义。但该字符串实际上并不包含任何反斜杠。 感谢您的评论。这个换行符实际上破坏了我的 Uri.EscapeUriString()。基本上,我需要将此字符串作为查询字符串参数发送到funtranslations.com/api/shakespeare#translate。 Uri.EscapeUriString()。我得到低于结果 A%20strange%20seed%20was%0Aplanted%20on%20its%0Aback%20at%20birth.%0CThe%20plant%20sprouts%0Aand%20grows%20with%0Athis%20POK%C3%A9MON。不幸的是,我收到了一个错误。如果我在 uri 编码之前删除了 \n 和 \f,那么我就能得到我想要的结果。 对,所以删除那些...但是当你没有转义序列时,不要指望 Unescape 方法会做任何事情。 (无论如何,您都不想通过它的声音来取消它们 - 听起来您想删除字符,这不是一回事。) “我得到低于结果” - 这有什么问题?你期待什么结果? 啊好吧,这是否意味着我必须使用 string.Replace() 手动删除所有这些? 【参考方案1】:

当然,您得到的是相同的字符串 - 您的示例中没有转义字符 :)

字符串 literal 有转义字符,但这些字符本身并不存在。当即时窗口打印出结果时,它会将其显示为字符串文字本身。例如,您从 Console.WriteLine 之类的东西中获得的信息是不一样的。

【讨论】:

感谢您的评论。这条线实际上打破了我的 Uri.EscapeUriString()。基本上,我需要将此字符串作为查询字符串参数发送到 funtranslations.com/api/shakespeare#translate。 Uri.EscapeUriString()。我得到低于结果 A%20strange%20seed%20was%0Aplanted%20on%20its%0Aback%20at%20birth.%0CThe%20plant%20sprouts%0Aand%20grows%20with%0Athis%20POK%C3%A9MON。不幸的是,我收到了一个错误。如果我在 uri 编码之前删除 \n 和 \f,那么我能够得到我想要的结果。 api.funtranslations.com/translate/….【参考方案2】:

您可以使用regex replace 并拥有一组可能的转义序列(如 \n 和 \t 等)

(更新)示例:https://rextester.com/WXSC17170

【讨论】:

这个正则表达式不会匹配任何东西。 Example 从示例中删除@并显示结果,它应该可以工作:rextester.com/ZSVQ23438

以上是关于无法在 C# 中使用 Regex.Unescape 删除转义序列的主要内容,如果未能解决你的问题,请参考以下文章

无法在 C# 中使用 mysql 分配运算符

无法使用带有 Name.EndsWith 的反射在 C# 中找到接口

使用 C# 出现错误“无法在表中插入标识列的显式值”

无法在 Visual C# 项目中使用我的 .dll

无法在 c# 中使用 SqlDataAdapter 和 MSSqlServer 插入数据库

无法使用 C# 在 Selenium WebDriver 中使用现有的 Firefox 配置文件