如何在 C# 2.0 中使用正则表达式处理 < 或 > 类型的字符串的编码

Posted

技术标签:

【中文标题】如何在 C# 2.0 中使用正则表达式处理 < 或 > 类型的字符串的编码【英文标题】:How to handle Encoding for < or > type of string using Regular expression in C# 2.0 【发布时间】:2012-05-29 09:59:59 【问题描述】:

下面是用 C#2.0 代码编写的正则表达式,用于删除不需要的查询字符串(excludeList 中存在的任何内容)将从页面查询字符串中排除,它对我来说很好。

string querystring = string.Empty;                       
string excludeList = "cid,incid,h";                        
querystring = Regex.Replace(Regex.Replace(Regex.Replace(HttpContext.Current.Request.Url.Query, @"^\?", "&"), "&(" + excludeList.Replace(",", "|") + ")=[^&]*", "", RegexOptions.IgnoreCase), "^&", "?");

现在我想修改我的正则表达式,以便如果我的 excludeList 包含如下内容,如果我的页面查询字符串中有任何 将进行编码。

string excludeList = "cid,incid,h,<,>"; 

例如,如果我的页面查询字符串包含某些内容,则应将其编码为正确的 #343script#545(示例)

请建议处理编码需要做哪些修改。

谢谢。

编辑:

HttpContext.Current.Request.Url.Query = "http://localhost:80/faq.aspx?faqid=123&cid=5434&des=dxb&incid=6565&data=<sam>";
string excludeList = "cid,incid,h,<,>";  

现在我上面的正则表达式应用于上面的查询字符串变量时,它将呈现如下

string querystring = Regex.Replace(Regex.Replace(Regex.Replace(HttpContext.Current.Request.Url.Query, @"^\?", "&"), "&(" + excludeList.Replace(",", "|") + ")=[^&]*", "", RegexOptions.IgnoreCase), "^&", "?");

querystring = "?faqid=123&des=dxb&data=%3C%20sam%20%3E";

现在一切正常,我想使用上面的正则表达式对“”进行编码。

【问题讨论】:

【参考方案1】:

试试这个

(?is)^(?<del>[^\?]+?)(?<retain>\?.+)$

说明

@"
(?is)         # Match the remainder of the regex with the options: case insensitive (i); dot matches newline (s)
^             # Assert position at the beginning of the string
(?<del>       # Match the regular expression below and capture its match into backreference with name “del”
   [^\?]         # Match any character that is NOT a ? character
      +?            # Between one and unlimited times, as few times as possible, expanding as needed (lazy)
)
(?<retain>    # Match the regular expression below and capture its match into backreference with name “retain”
   \?            # Match the character “?” literally
   .             # Match any single character
      +             # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)
$             # Assert position at the end of the string (or before the line break at the end of the string, if any)
"

更新代码

string resultString = null;
try 
    resultString = Regex.Replace(subjectString, @"(?is)^(?<del>[^?]+?)(?<retain>\?.+)$", "$retain");
 catch (ArgumentException ex) 
    // Syntax error in the regular expression

【讨论】:

@如何在我现有的正则表达式中使用上面的正则表达式,我想在我现有的正则表达式中处理,请建议如何处理 的编码 subjectString 的值是多少,以及我现有的用于从查询字符串中删除查询字符串的正则表达式如何......请建议 我看不到 的编码处理,所以你的意思是我不必使用我的正则表达式 我应该使用你的正则表达式,并且在应用正则表达式之后如何更新值将存储回我的查询字符串变量 更新了问题,请参阅编辑部分。 我真的不明白你的解决方案中的编码处理,正如我所要求的那样只有,但仍然没有编码处理

以上是关于如何在 C# 2.0 中使用正则表达式处理 < 或 > 类型的字符串的编码的主要内容,如果未能解决你的问题,请参考以下文章

Django 2.0 的路由如何实现正则表达式

如何使用 C# 在 Visual Studio 2010 中使用正则表达式或 HTMLAgilityPack 抓取 HTML 页面的特定部分?

C#正则表达式如何从字符串中排除

C#当中如何使用正则表达式获取某一标签的所有属性 属性数量不确定

如何在 C# 2.0 中支持泛型表达式

使用正则表达式查找 C# 样式的未转义字符串