代码之家  ›  专栏  ›  技术社区  ›  Sprogz

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

  •  5
  • Sprogz  · 技术社区  · 17 年前

    我有下面的c_,它简单地替换了输入字符串中看起来像equip:19d005的部分,并将其转换为URL,如下所示:

    input = Regex.Replace(input, @"(EQUIP:)(\S+)", @"<a title=""View equipment item $2"" href=""/EquipmentDisplay.asp?eqnum=$2"">$1$2</a>", RegexOptions.IgnoreCase);
    

    HTML最终看起来像这样。

    <a title="View equipment item 19d005" href="/EquipmentDisplay.asp?eqnum=19d005">EQUIP:19d005</a>
    

    唯一的问题是目标页希望eqnum querystring全部为大写,因此当eqnum=19d005时,它返回正确的设备,但如果它接收到eqnum=19d005,则失败。

    我想我可以修改和更正equipmentdisplay.asp对大写值的错误要求,但是如果可能的话,我想让C代码符合现有的经典ASP页面,在上面的regex.replace语句中大写$2。

    理想情况下,我希望返回的HTML如下所示:

    <a title="View equipment item 19d005" href="/EquipmentDisplay.asp?eqnum=19D005">EQUIP:19d005</a>
    

    注意,尽管原始字符串是equip:19d005(小写),但只有eqnum=值是大写的。

    可以吗?如果可以,最整齐的方法是什么?

    6 回复  |  直到 14 年前
        1
  •  12
  •   abatishchev Karl Johan    14 年前

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

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

    另一个使用单独的函数:

    var input = Regex.Replace(input, @"(EQUIP:)(\S+)", Evaluator, RegexOptions.IgnoreCase);
    
    private static string Evaluator(Match match)
    {
        return 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());
    }
    
        2
  •  3
  •   abatishchev Karl Johan    14 年前

    使用regex。直接替换我认为没有办法。但是你可以把这个过程分为两步,得到你想要的结果。

    var match = Regex.Match(input, @"(EQUIP:)(\S+)", RegexOptions.IgnoreCase);
    var input = String.Format( @"&lt;a title=""View equipment item {1}"" href=""/EquipmentDisplay.asp?eqnum={2}""&gt;{0}{1}&lt;/a&gt;", 
    match.Groups[1].Value,
    match.Groups[2].Value,
    match.Groups[2].Value.ToUpper());
    
        3
  •  1
  •   Vinko Vrsalovic    17 年前

    您可以在替换中使用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(@"<a title=""View item {0}"" 
                href=""/EqDisp.asp?eq={2}"">{1}{0}</a>",
                m.Groups[2].Value,m.Groups[1].Value,m.Groups[2].Value.ToUpper());
     }
    
        4
  •  0
  •   John Fiala    17 年前

    假设输入是字符串:

    input = Regex.Replace(input.ToUpper, @"(EQUIP:)(\S+)", @"<a title=""View equipment item $2"" href=""/EquipmentDisplay.asp?eqnum=$2"">$1$2</a>", RegexOptions.IgnoreCase);

    更改字符串的大小写不是regex所做的。

        5
  •  0
  •   Jesse C. Slicer    17 年前
    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(@"<a title=""View equipment item {1}"" href=""/EquipmentDisplay.asp?eqnum={2}"">{0}{1}</a>", eqlabel, eqnum, eqnumu);
    
        6
  •  0
  •   Vivek    17 年前
    public static string FormatToCustomAnchorTag(this string value)
    {
    
        return Regex.Replace(value.ToLower() + value.ToUpper(),
                    @"(?<equiplo>equip:)(?<equipnolo>\S+)(?<equipup>EQUIP:)(?<equipnoup>\S+)",
                    @"<a title=""View equipment item ${equipnolo}"" href=""/EquipmentDisplay.asp?eqnum=${equipnoup}"">${equipup}${equipnolo}</a>");
    }