C# 在编码字符串上使用正则表达式

C# 在编码字符串上使用正则表达式,c#,regex,asp.net-mvc,C#,Regex,Asp.net Mvc,我有以下正则表达式: @"{0}(.+?)(?:{1}(.{4}?))*(?:{2}(.+?))?{3}", "\\[\\[\\[", "\\|\\|\\|", "\\/\\/\\/", "\\]\\]\\] 要查找包装在[[[something]]、[[[[something///comment]]中的项目 我用它来解析web响应上的某些内容 问题是,在我的web响应中,有一些东西编码如下: %5B%5B%5BPedido%20de%20Informa%C3%A7%C3%A3o%5D%5D%

我有以下正则表达式:

@"{0}(.+?)(?:{1}(.{4}?))*(?:{2}(.+?))?{3}", "\\[\\[\\[", "\\|\\|\\|", "\\/\\/\\/", "\\]\\]\\]
要查找包装在[[[something]]、[[[[something///comment]]中的项目

我用它来解析web响应上的某些内容

问题是,在我的web响应中,有一些东西编码如下:

%5B%5B%5BPedido%20de%20Informa%C3%A7%C3%A3o%5D%5D%5D
因此,我无法确定它是以[[[和]]]开头,还是以其他项目结尾


有没有办法在regex端解决这个问题?

您可以使用以下帮助函数取消此字符串的scape:

Uri.UnescapeDataString("%5B%5B%5BPedido%20de%20Informa%C3%A7%C3%A3o%5D%5D%5D");
将产生:

"[[[Pedido de Informação]]]"

注意:
还有
HttpUtility.UrlDecode
,但需要添加对
System.Web
的引用,这并非总是需要的。

您可以使用以下帮助函数来取消此字符串的显示:

Uri.UnescapeDataString("%5B%5B%5BPedido%20de%20Informa%C3%A7%C3%A3o%5D%5D%5D");
将产生:

"[[[Pedido de Informação]]]"

注意:
还有
HttpUtility.UrlDecode
,但需要添加对
System.Web
的引用,这并非总是需要的。

如果不选择取消字符串,则可以使用
(?:…)
来允许
%5B
替代
[
(与
%5D
]
相同)

例如,
\[\\[\\[
可以替换为
(?:\\[\\[\\[\\[\\[\\[\\[\\[\[\\[\\[\\[\[\\[\\[\\[\\[\\[\\[\\[\\[\\[\\\[\\\[\\[\\\[\\\[\[\\[\\[\\\[\


但是,请注意,这也将匹配
[[[…%5D%5D%5D
,在您的情况下,这可能是一个问题,也可能不是问题。

如果不选择取消字符串,您可以使用
(?:…)
|
来允许
%5B
替代
[
(与
%5D
]相同)

例如,
\[\\[\\[
可以替换为
(?:\\[\\[\\[\\[\\[\\[\\[\\[\[\\[\\[\\[\[\\[\\[\\[\\[\\[\\[\\[\\[\\[\\\[\\\[\\[\\\[\\\[\[\\[\\[\\\[\


但是,请注意,这也将匹配
[[[…%5D%5D%5D
,这在您的情况下可能是个问题,也可能不是问题。

您可以扩展正则表达式以查找转义括号以及普通括号,但是正则表达式很快就会变得不可读。字符串上的HtmlDecode将更好地处理此问题。任何web响应的正则表达式解析在边缘情况下或当有人恶意ds值。您可以展开正则表达式以查找转义括号和普通括号,但正则表达式很快就会变得不可读。字符串上的HtmlDecode将更好地处理此问题。在边缘情况下或有人恶意发送值时,web响应的任何正则表达式解析都很容易中断。这不是一个选项,因为字符串是整个webpage和我不想取消扫描整个内容,因为我可能会遇到问题,因为在发送响应以显示网页之后。我仍然会将其全部取消扫描到正则表达式使用的临时变量。我看到了,但我正在翻译[[]]中的字符串,并用“翻译版本”替换[[[原始字符串]]]。这就是我的问题…我想我应该用一个类似的版本(编码或不编码)来替换它们@MDMoura:这是怎么回事:1.解码,2.转义,3.重新编码(Uri.EscapeDataString)。这还有一个额外的优点,就是你的翻译也会被编码!(如果网页需要编码字符串,这是一件好事)这不是一个选项,因为字符串是一个完整的网页,我不想取消扫描整个内容,因为在发送响应以显示网页后,我可能会遇到问题。尽管如此,我还是会将其取消扫描到regex使用的临时变量。我明白了,但我正在翻译[[]]中的字符串并替换[[[原始字符串]]]由“翻译版本”替换。这是我的问题…我想我应该用类似的版本(编码或不编码)替换它们@MDMoura:这是怎么回事:1.解码它,2.转义所有内容,3.重新编码它(Uri.EscapeDataString)。这还有一个额外的优点,就是你的翻译也会被编码!(如果网页需要编码字符串,这是一件好事)