当涉及到正则表达式时,即使不涉及正则表达式,Unescape也会失败

本文关键字:正则表达式 Unescape 失败 | 更新日期: 2023-09-27 18:16:36

我收到一些结果数据如下:

'u003cdiv'u003esome message comes here'u003c/div'u003e

我需要解析它,这很容易完成:

string result = HttpUtility.HtmlDecode(Regex.Unescape(data));

但是如果字符串中有一个正则表达式,例如:

'u003cdiv'u003esome message 'w+ comes here'u003c/div'u003e

会抛出错误:

解析"'u003cdiv' u003some message 'w+ comes here'u003c/div'u003e" -无法识别的转义序列'w.

我不需要处理文本中的正则表达式或任何可以从字面上理解的东西。

如何转换:

'u003cdiv'u003esome message 'w+ comes here'u003c/div'u003e

恢复正常?

<div>some message 'w+ comes here</div>

注意:我已经环顾四周,但没有找到针对这一点的答案,我确实发现答案告诉人们使用@,但是数据不是由我输入的,而是从其他地方收到的,所以我认为我不能做string data = @receivedData; AFAIK。

当涉及到正则表达式时,即使不涉及正则表达式,Unescape也会失败

这里混合了两种独立的转义类型。你可以试试:

Regex.Unescape(Regex.Replace(data, "''''([^u])", "''''$1"))

这将保留'u...值,但转义其他反斜杠。

如果您经常执行此操作,您将需要创建一个Regex模式实例并在每次调用时重用它:

Regex regex = new Regex("''''([^u])"); // Reuse this instance
// When parsing the data:
Regex.Unescape(regex.Replace(data, "''''$1"));

这里的问题是您试图应用正则表达式。无法逃脱到没有完全被Regex.Escape处理过的东西。在对消息进行部分编码而对其他部分未编码的情况下,几乎任何编码都会遇到同样的问题。您可以尝试预测所有的变化,但在某些情况下,您将无法区分打算未编码的内容和其他未转义的内容。唯一可靠的方法是确保整个消息的编码是一致的。这意味着无论何时对字符串执行操作,都要完全解码消息,然后重新编码整个字符串。

下面是我在linqpad中做的演示,每个相应的.Dump()都有输出。它进行完整的编码,然后完成解码。您会注意到,在Regex编码过程中,'w会被转义。所以你遇到的问题的关键是消息的"一些消息'w+这里"部分不是正则表达式编码,所以应用正则表达式。Unescape到它将会失败,因为你不能Unescape到没有转义的东西

string ori = @"<div>some message 'w+ here</div>"; //only escaping is '' for the C# string which is really '
ori.Dump(); // Verify that real string is "<div>some message 'w+ here</div>"
string regexEscaped = System.Text.RegularExpressions.Regex.Escape(ori);
regexEscaped.Dump();    
//Regex escape does not replace "<" with unicode characters as it seems an unnecesary escape sequence.  I can force them into the regex encoded string
//This step is unnecesary and can be commented out.
//regexEscaped = regexEscaped.Replace(">", @"'u003e").Replace("<",@"'u003c");    
//regexEscaped.Dump();
string htmlEscaped_regexEscaped = System.Web.HttpUtility.HtmlEncode(regexEscaped).Dump();
System.Text.RegularExpressions.Regex.Unescape( System.Web.HttpUtility.HtmlDecode(htmlEscaped_regexEscaped)).Dump();
// Since we encoded the entire string we were able to successfully decode it.
输出:

 Original: <div>some message 'w+ here</div>
Rgx Escpd: <div>some' message' ''w'+' here</div>
HTML Encd: &lt;div&gt;some' message' ''w'+' here&lt;/div&gt;
HTML Uncd & Rgx Unesc: <div>some message 'w+ here</div>

您是否使用此进行匹配?

如果您的意图是使用字符串"'u003cdiv' u003some message 'w+ comes here'u003c/div'u003e"作为执行匹配的Regex表达式,则不需要对它做任何事情。实现完整正则表达式特性集的匹配器应该理解"'u003c",因此没有必要尝试将其转换为"<":

http://www.regular-expressions.info/unicode.html

客户端是不是真的做一个正则表达式转义?

似乎更有可能的是客户端并没有真正执行regex转义,因此regex。逃避注定要失败。它是否在做某种Html编码,但用unicode代码代替Html字符代码的字符?也许吧。如果没有为客户端记录行为,这是一个有根据的猜测,并希望它们不会在以后产生其他不一致的编码。

在这种情况下,我将只针对unicode转义序列。这里有一个问题,涉及替换unicode转义序列和不使用Regex的主题。Unescape :

如何将。net字符串中的unicode转义序列转换为unicode字符