2012-12-24 19 views
5

Tôi muốn sử dụng biểu tượng trong mẫu RegEx để tìm các kết quả phù hợp, nhưng tôi không muốn chúng thay thế. Điều này là dành cho thao tác lớp và không gian tên trong C#.RegEx - Kết hợp sử dụng các biểu tượng nhưng không thay thế chúng

Ví dụ:

MyNamespaceLib.EntityDataModelTests.TestsMyClassTests+MyInnerClassTests

phải được thay thế như:

MyNamespaceLib.EntityDataModel.TestsMyClass+MyInnerClass

(Lưu ý, chỉ "thử nghiệm" là thay thế khi nó xuất hiện cuối cùng của phần không gian tên và không phải khi đó là một phần của tên lớp/không gian tên)

Tôi đã giành được phần đầu tiên trong việc tìm kiếm các trận đấu, nhưng tôi đang chiến đấu để giữ các biểu tượng trong trận đấu thay thế.

Cho đến nay tôi có:

var input = "MyNamespaceLib.EntityDataModelTests.TestsMyClassTests+MyInnerClassTests";

var output = Regex.Replace(input, "Tests[.+]|$", "");

Tôi đã thử sử dụng một nhóm phi chụp, nhưng tôi nghi ngờ nó không có nghĩa là cho con đường tôi cố gắng sử dụng nó.

Cảm ơn!

Trả lời

6

Vì vậy, những gì bạn muốn làm là thay thế các kết quả phù hợp không theo sau là . hoặc +? Sử dụng một lookahead:

@"Tests(?![.+])" 
+0

Không, ngược lại, tôi muốn thay thế các kết quả khớp với ".", "+" Hoặc cuối dòng. Nhưng nếu từ "Kiểm tra" xuất hiện trong một không gian tên hoặc tên lớp, thì nó không được thay thế. – Steve

+0

@ user1927385: 'Thử nghiệm (?! [^. +])', Sau đó. – Ryan

+0

Đẹp, điều đó hoạt động hoàn hảo. Tôi đã không bao giờ được sử dụng lookaheads trong Regex, vì vậy tôi sẽ đi đọc thêm một số chi tiết. Cảm ơn minitech. – Steve

1

Bạn có thể sử dụng quá tải MatchEvaluator của phương pháp Regex.Replace, nơi chuỗi thay trận đấu với được tạo ra khi đang bay. Tôi nhận được simbol đặc biệt trong một nhóm chụp (và nhóm chụp đầu tiên luôn luôn là Nhóm 1 của trận đấu), và thay thế phù hợp với các giá trị, như thế này:

var output = Regex.Replace(input, @"Tests([.+]|$)", m => m.Groups[1].Value); 

Ngoài ra, theo bình luận minitech, bạn có thể cũng sử dụng $ 1 cho nhóm chụp đầu tiên trong (string, string) quá tải của Regex.Replace, như:

var output = Regex.Replace(input, @"Tests([.+]|$)", "$1"); 

Điều đó nói rằng, một regex thường được viết chỉ mã, vì vậy bạn luôn có thể làm một câm và thay thế đơn giản:

var output = input.Replace("Tests+","").Replace("Tests.","") ...; 
+0

Vâng, nó sẽ hoạt động, tôi đã cố gắng hoàn thành nó với một mẫu RegEx. điều này cuối cùng nếu tôi không thể làm cho nó hoạt động. – Steve

+0

Có, được thực hiện với [quá tải Regex.Replace] này (http://msdn.microsoft.com/en-us/library/cft8645c.aspx), tôi sẽ cố gắng nấu một ví dụ sau một phút. – SWeko

+0

Nếu bạn muốn thay thế một cái gì đó với giá trị của một nhóm, bạn có thể làm điều đó bên trong một chuỗi: 'Regex.Replace (...," $ 1 ")' – Ryan

Các vấn đề liên quan