C#中的正则表达式大写替换

我有以下C#,它简单地将看起来像EQUIP:19d005的输入字符串部分替换为URL,如下所示:

input = Regex.Replace(input, @"(EQUIP:)(\S+)", @"$1$2", RegexOptions.IgnoreCase); 

HTML最终看起来像这样。

 EQUIP:19d005 

唯一的麻烦是目标页面要求eqnum查询字符串全部为UPPERCASE,因此它在eqnum = 19D005时返回正确的设备,但如果收到eqnum = 19d005则失败。

我想我可以修改和纠正EquipmentDisplay.asp对大写值的错误要求,但是,如果可能的话,我想通过在上面的Regex.Replace语句中大写$ 2来使C#代码符合现有的经典ASP页面。

理想情况下,我希望返回的HTML看起来像这样:

 EQUIP:19d005 

请注意,虽然原始字符串是EQUIP:19d005(小写),但只有eqnum =值是大写的。

它可以做到,如果是这样,最干净的方法是什么?

好的,2个解决方案,一个内联:

 input = Regex.Replace(input, @"(EQUIP:)(\S+)", m => string.Format(@"{0}{1}", m.Groups[1].Value, m.Groups[2].Value, m.Groups[2].Value.ToUpper()), RegexOptions.IgnoreCase); 

另一个使用单独的function:

 var input = Regex.Replace(input, @"(EQUIP:)(\S+)", Evaluator, RegexOptions.IgnoreCase); private static string Evaluator(Match match) { return string.Format(@"{0}{1}", match.Groups[1].Value, match.Groups[2].Value, match.Groups[2].Value.ToUpper()); } 

直接使用Regex.Replace我不认为有办法。 但是你可以把它分为两步,得到你想要的结果。

 var match = Regex.Match(input, @"(EQUIP:)(\S+)", RegexOptions.IgnoreCase); var input = String.Format( @"<a title=""View equipment item {1}"" href=""/EquipmentDisplay.asp?eqnum={2}"">{0}{1}</a>", match.Groups[1].Value, match.Groups[2].Value, match.Groups[2].Value.ToUpper()); 

您可以在替换中使用MatchEvaluator委托而不是字符串。 然后,如果在最近的.NET上,您可以将委托嵌入为匿名函数。 “旧”解决方案可能如下所示:

  static void Main(string[] args) { string input = "EQUIP:12312dd23"; string output = Regex.Replace(input, @"(EQUIP:)(\S+)", new MatchEvaluator(genURL), RegexOptions.IgnoreCase); Console.WriteLine(output); Console.ReadKey(); } static string genURL(Match m) { return string.Format(@"{1}{0}", m.Groups[2].Value,m.Groups[1].Value,m.Groups[2].Value.ToUpper()); } 

假设输入是一个字符串:

input = Regex.Replace(input.ToUpper, @"(EQUIP:)(\S+)", @"$1$2", RegexOptions.IgnoreCase);

改变字符串的大小写不是正则表达式所做的。

 string input = "EQUIP:19d005"; Regex regex = new Regex (@"(EQUIP:)(\S+)", RegexOptions.IgnoreCase); string eqlabel = regex.Replace(input, "$1"); string eqnum = regex.Replace(input, "$2"); string eqnumu = eqnum.ToUpperInvariant(); input = string.Format(@"{0}{1}", eqlabel, eqnum, eqnumu); 
 public static string FormatToCustomAnchorTag(this string value) { return Regex.Replace(value.ToLower() + value.ToUpper(), @"(?equip:)(?\S+)(?EQUIP:)(?\S+)", @"${equipup}${equipnolo}"); }