2008-10-15 51 views
5

我有以下的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查詢字符串,以全部大寫所以它返回正確的設備時,eqnum = 19D005,但如果它收到eqnum = 19d005失敗。

我想我可以修改和糾正EquipmentDisplay.asp對大寫值的錯誤要求,但如果可能的話,我想通過在上面的Regex.Replace語句中大寫$ 2來使C#代碼符合現有的經典ASP頁面。

理想情況下,我想返回的HTML看起來像這樣:

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

注意雖然原始字符串是裝備:19d005(小寫),只有eqnum =值大寫的。

能不能做到,如果是這樣,什麼是應該做它最整潔的方式嗎?

回答

12

OK,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()); 
} 
+0

一行程序是一個非常優雅的解決方案,它的方式工作很大。 @Vinko提到使用匿名函數,但沒有舉例,因此我選擇了你的解決方案。我有點困惑,因爲我已經看到=>用於LINQ to SQL,表達式樹和現在的匿名函數?爲什麼這麼多用途? – Sprogz 2008-10-16 07:41:28

0

假設輸入是一個字符串:

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

更改字符串的情況下,不是正則表達式一樣。

3

使用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()); 
1

您可以在替換中使用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
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
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>"); 
}