2008-10-15 7 views
5

Tôi có sau C# mà chỉ đơn giản thay thế các bộ phận của chuỗi đầu vào trông giống như EQUIP: 19d005 vào URL, như thế này:Regular Expression thay thế hoa trong C#

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

HTML sẽ trông như thế này.

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

Vấn đề duy nhất là trang đích hy vọng querystring eqnum được tất cả các chữ hoa nên nó sẽ trả về các thiết bị chính xác khi eqnum = 19D005 nhưng thất bại nếu nó nhận eqnum = 19d005.

Tôi đoán tôi có thể sửa đổi và sửa yêu cầu giá trị chữ hoa của DesignDisplay.asp về giá trị chữ hoa, nếu có thể tôi muốn làm cho mã C# tuân thủ trang ASP cổ điển hiện có bằng cách tăng $ 2 trong câu lệnh Regex.Replace ở trên .

Lý tưởng nhất, tôi muốn HTML trở lại giống như thế này:

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

Thông báo mặc dù chuỗi ban đầu là EQUIP: 19d005 (chữ thường), chỉ có eqnum = giá trị được uppercased.

Nó có thể được thực hiện và nếu có, cách nào là cách dễ nhất để làm điều đó?

Trả lời

12

OK, 2 giải pháp, một inline:

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); 

Các khác sử dụng một chức năng riêng biệt:

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

Một lớp lót là một giải pháp rất thanh lịch, hoạt động hiệu quả bằng cách này. @Vinko đề cập đến việc sử dụng chức năng ẩn danh nhưng không đưa ra ví dụ, do đó tại sao tôi chọn giải pháp của bạn. Tôi là một chút bối rối như tôi đã thấy => được sử dụng cho LINQ to SQL, biểu hiện cây và bây giờ các chức năng vô danh? Tại sao rất nhiều công dụng? – Sprogz

+0

Cú pháp kiểu => là một phiên bản ngắn hơn của cú pháp delegate() {}. Các ưu điểm khác là nếu bạn có một lớp lót như trên, bạn không cần câu lệnh trả về và các kiểu được suy ra - vì vậy tôi chỉ định m thay vì Đối sánh m. Cú pháp lambda giúp làm cho mã ngắn gọn hơn. – Duncan

0

Giả sử đầu vào đó là một chuỗi:

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

Thay đổi trường hợp của một chuỗi không phải cái gì regex không.

3

Sử dụng Regex.Đặt trực tiếp Tôi không nghĩ có cách nào. Nhưng bạn có thể thực hiện quy trình hai bước này và nhận được kết quả mà bạn đang tìm kiếm.

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

Bạn có thể sử dụng đại biểu MatchEvaluator thay vì một chuỗi thay thế. Sau đó bạn có thể nhúng ủy nhiệm như một hàm ẩn danh nếu trên .NET gần đây. Giải pháp 'cũ' có thể trông giống như một cái gì đó như thế này:

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>"); 
}