2013-07-26 57 views
6

Vì vậy, tôi có một vài phần mở rộng tệp trong các dự án C# của mình và tôi cần xóa chúng khỏi tên tệp nếu chúng ở đó.Cách xóa một chuỗi con nhất định trong C#

Cho đến nay tôi biết tôi có thể kiểm tra xem chuỗi con có nằm trong Tên tệp hay không.

if (stringValue.Contains(anotherStringValue)) 
{ 
    // Do Something // 
} 

Vì vậy, nếu nói stringValuetest.asm, và sau đó nó chứa .asm, tôi muốn bằng cách nào đó loại bỏ các .asm từ stringValue.

Tôi làm cách nào để thực hiện việc này?

+0

gì nếu giá trị chuỗi là 'helloworld' và bạn muốn loại bỏ 'l'. nó có nghĩa là nó sẽ loại bỏ tất cả các chuỗi phù hợp và đầu ra sẽ là 'heoword'? –

+0

Bạn nên sử dụng 'EndsWith (". Asm ")' (hoặc sử dụng [Path.GetExtension] (http://msdn.microsoft.com/en-us/library/system.io.path.getextension.aspx)) để tránh các trường hợp góc như "filename.asmo.doc" ('Chứa' sẽ trả về một số dương sai ở đây) –

Trả lời

7

nếu bạn muốn có một "danh sách đen" cách tiếp cận kết hợp với thư viện Path:

// list of extensions you want removed 
String[] badExtensions = new[]{ ".asm" }; 

// original filename 
String filename = "test.asm"; 

// test if the filename has a bad extension 
if (badExtensions.Contains(Path.GetExtension(filename).ToLower())){ 
    // it does, so remove it 
    filename = Path.GetFileNameWithoutExtension(filename); 
} 

ví dụ xử lý:

test.asm  = test 
image.jpg  = image.jpg 
foo.asm.cs  = foo.asm.cs <-- Note: .Contains() & .Replace() would fail 
+0

Tôi cảm thấy như thể đây là cách sạch nhất/đẹp nhất để xử lý và dễ dàng bổ sung cho các tiện ích mở rộng khác. Cảm ơn bạn! – Annabelle

6

Không cần cho if(), chỉ cần sử dụng:

stringValue = stringValue.Replace(anotherStringValue,""); 

nếu anotherStringValue không được tìm thấy trong stringValue, sau đó không có thay đổi sẽ xảy ra.

+2

Tôi khuyên bạn nên chống lại điều này; nó sẽ xóa _all_ lần xuất hiện, không chỉ là phần mở rộng. –

+1

ít nhất tôi sẽ kiểm tra 'EndsWith (anotherStringValue)' và sử dụng 'stringValue.SubString (0, stringValue.Length - anotherStringValue.Length)' –

7

Bạn có thể sử dụng Path.GetFileNameWithoutExtension(filepath) để làm điều đó.

if (Path.GetExtension(stringValue) == anotherStringValue) 
{ 
    stringValue = Path.GetFileNameWithoutExtension(stringValue); 
} 
+4

Điều này sẽ nhận được các kết quả sai nếu 'anotherStringValue' tồn tại ở bất kỳ đâu trong chuỗi, ngay cả khi nó không phải là phần mở rộng. –

+1

Cảm ơn bạn đã bình luận. Bạn đúng rồi. Tôi đã chỉnh sửa mã số – Vasiliy

+2

Có lẽ cũng muốn sử dụng '.ToLower()', hoặc 'String.Compare' với cờ không nhạy cảm để tránh bất kỳ vấn đề CasE nào. –

3

Thêm một cách tiếp cận một lót để loại bỏ chỉ ".asm" ở cuối và không phải bất kỳ "asm" nào ở giữa chuỗi:

stringValue = System.Text.RegularExpressions.Regex.Replace(stringValue,".asm$",""); 

"$" khớp với phần cuối của chuỗi.

Để phù hợp với ".asm" hoặc ".asm" hoặc bất kỳ equivlanet, bạn có thể tiếp tục chỉ định Regex.Replace bỏ qua trường hợp:

using System.Text.RegularExpresions; 
... 
stringValue = Regex.Replace(stringValue,".asm$","",RegexOptions.IgnoreCase); 
Các vấn đề liên quan