Замена заглавных букв регулярного выражения в C # - PullRequest
5 голосов
/ 15 октября 2008

У меня есть следующий 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 будет иметь значение UPPERCASE, поэтому она возвращает правильное оборудование, когда eqnum = 19D005, но завершается ошибкой, если получает eqnum = 19d005.

Полагаю, я могу изменить и исправить ошибочное требование EquipmentDisplay.asp о значениях в верхнем регистре, однако, если возможно, я бы хотел, чтобы код C # соответствовал существующей классической странице ASP, указав верхний регистр $ 2 в приведенном выше утверждении Regex.Replace.

В идеале я бы хотел, чтобы возвращаемый HTML-код выглядел следующим образом:

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

Обратите внимание, что хотя исходная строка была EQUIP: 19d005 (нижний регистр), в верхнем регистре только значение eqnum =.

Можно ли это сделать, и если да, то какой самый аккуратный способ сделать это?

Ответы [ 6 ]

12 голосов
/ 15 октября 2008

ОК, 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());
}
3 голосов
/ 15 октября 2008

Использование Regex.Replace напрямую Я не думаю, что есть способ. Но вы могли бы сделать это двухэтапным процессом и получить результат, который вы ищете.

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());
2 голосов
/ 15 октября 2008

Вы можете использовать делегат 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());
 }
0 голосов
/ 15 октября 2008
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>");
}
0 голосов
/ 15 октября 2008
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);
0 голосов
/ 15 октября 2008

Предполагая, что вводом является строка:

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

Изменение регистра строки - это не то, что делает регулярное выражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...