【问题标题】:Using Regex on encoded strings对编码字符串使用正则表达式
【发布时间】:2014-07-09 16:35:26
【问题描述】:

我有以下正则表达式:

@"{0}(.+?)(?:{1}(.{4}?))*(?:{2}(.+?))?{3}", "\\[\\[\\[", "\\|\\|\\|", "\\/\\/\\/", "\\]\\]\\]

要查找包裹在 [[[something]]]、[[[something///comment]]] 中的项目。

我正在使用它来解析网络响应中的某些内容...

问题是在我的网络响应中,我有一些编码如下:

%5B%5B%5BPedido%20de%20Informa%C3%A7%C3%A3o%5D%5D%5D

所以我无法确定它以 [[[ 并以 ]]] 开头以及其他项目。

有没有办法在正则表达式方面解决这个问题?

【问题讨论】:

  • 您可以扩展正则表达式以查找转义括号以及普通括号,但正则表达式很快就会变得不可读。字符串上的 HtmlDecode 会更好地处理这个问题。任何对 Web 响应的正则表达式解析都容易在极端情况下或有人恶意发送值时中断。

标签: c# regex asp.net-mvc


【解决方案1】:

您可以使用以下辅助函数取消转义该字符串:

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

将产生:

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

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

【讨论】:

  • 这不是一个选项,因为字符串是整个网页,我不想取消转义整个内容,因为在发送响应以显示网页后我可能会遇到问题。跨度>
  • 我仍然会将其全部转义为正则表达式使用的临时变量。
  • 我明白了,但是我正在翻译 [[[ ]]] 中的字符串,并将 [[[original string]]] 替换为“翻译版本”。那是我的问题......我想我应该用类似的版本(编码与否)替换它们
  • @MDMoura:这个怎么样:1. 解码,2. 转义所有内容,3. 重新编码(Uri.EscapeDataString)。这还有一个额外的好处,就是您的翻译也会被编码! (这是一件好事,如果网页需要一个编码字符串)
【解决方案2】:

如果取消转义字符串不是一个选项,您可以使用 Noncapturing Group (?:...)Alternation Construct | 来允许 %5B 或者 [(对于 %5D] )。

例如,\\[\\[\\[ 可以替换为 (?:\\[\\[\\[|%5B%5B%5B)。修改完整的正则表达式留给读者作为练习。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 2015-04-21
    • 1970-01-01
    • 2023-04-05
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多