2010-11-04 62 views
26

Tôi có một mảng các chuỗi:C# loại bỏ chuỗi từ cuối chuỗi

string[] remove = { "a", "am", "p", "pm" }; 

Và tôi có một textbox mà người dùng nhập văn bản vào. Nếu họ nhập bất kỳ chuỗi nào trong mảng remove ở cuối văn bản trong hộp văn bản, thì chuỗi đó sẽ bị xóa. cách dễ nhất để làm điều này là gì?

EDIT Để làm rõ, tôi đang tạo trình phân tích cú pháp thời gian. Khi bạn cung cấp cho hàm một chuỗi, tốt nhất là phân tích nó thành định dạng này: 08:14pm Tôi có một hộp văn bản để kiểm tra nó. Khi tiêu điểm rời khỏi hộp văn bản, tôi cần lấy văn bản không có hậu tố am/pm/a/p để tôi có thể phân tích cú pháp phân đoạn chỉ số.

+1

Khi nào cần xóa? Bạn rõ ràng đang cố gắng giải quyết một tình trạng khó xử thời gian. Có thể có một cách tốt hơn để giải quyết vấn đề của bạn hoàn toàn –

+0

Khi hộp văn bản bị mất tiêu điểm, sự kiện 'OnLeave'. – Entity

+1

Tại sao bạn muốn thực hiện việc này? Sử dụng Danh sách chung – Shahin

Trả lời

57
string[] remove = { "a", "am", "p", "pm" }; 
string inputText = "blalahpm"; 

foreach (string item in remove) 
    if (inputText.EndsWith(item)) 
    { 
     inputText = inputText.Substring(0, inputText.LastIndexOf(item)); 
     break; //only allow one match at most 
    } 
+0

Bingo! Cảm ơn! (Làm cho tôi đợi 5 phút để đánh dấu câu trả lời này vì một số lý do ...) – Entity

+3

Câu trả lời đúng cho câu hỏi ban đầu. Tuy nhiên, tôi sẽ lập luận rằng nếu người dùng đã viết vào lúc 08:14, cô ấy có nghĩa là 20:14.Và ngay sau khi bạn bỏ qua trình chỉ định AM/PM, bạn không thể biết liệu thời gian có nên được phân tích cú pháp là 12 hoặc 24 giờ hay không. –

+0

nếu người dùng đã viết lúc 08:14, sau đó tôi sẽ để nó như thế. Nếu họ nhập '814pm' thì chương trình sẽ cần phải tách phần am/pm ra để xử lý chỉ phần số. Nó được thêm vào trước khi nó được đưa trở lại vào hộp văn bản. – Entity

0

Âm thanh như một địa điểm tốt cho regex.

using System.Text.RegularExpressions; 

public bool IsValidTime(string thetime) 
{ 
    Regex checktime = new Regex(@"^(20|21|22|23|[01]\d|\d)(([:][0-5]\d){1,2})$"); 

    return checktime.IsMatch(thetime); 
} 

Giả sử bạn muốn thời gian trong xx định dạng: xx

+0

Bởi 'd' cho bạn có nghĩa là' \ d'? – kennytm

+0

Cảm ơn, bỏ lỡ điều đó .. Tôi đã sửa nó. –

9
foreach (string suffix in remove) 
{ 
    if (yourString.EndsWith(suffix)) 
    { 
     yourString = yourString.Remove(yourString.Length - suffix.Length); 
     break; 
    } 
} 
1
var output = (from x in remove 
     where input.EndsWith(x) 
    select input.Substring(0, input.Length - x.Length)).FirstOrDefault() ?? input; 
1

Bạn có thể sử dụng DateTime as type chính của bạn sau đó.

Sử dụng DateTime.TryParse để đọc thời gian người dùng nhập. Và sử dụng DateTime.ToString để định dạng lại thời gian bằng bất kỳ định dạng nào bạn cần.

+1

Và nếu định dạng chính xác được biết (chẳng hạn như hh: mmtt), DateTime.ParseExact hoặc DateTime.TryParseExact có thể hữu ích. –

-1
char[] remove = { 'a', 'p', 'm' }; 
string s = "8:14pm"; 

s = s.TrimEnd(remove); 
+0

-1: Điều này sẽ thay đổi "8: 14pamm" thành "8:14", đó không phải là những gì OP muốn. –

+0

@DanielRose: Tôi nghĩ đây chính xác là những gì OP đang hỏi. "Nếu họ nhập bất kỳ chuỗi nào trong mảng xóa ở cuối văn bản trong hộp văn bản, nó sẽ bị xóa". Và: "Tôi cần lấy văn bản không có hậu tố am/pm/a/p". OP là đặc biệt yêu cầu làm thế nào để có được chỉ "8:14" – ulty4life

+0

OP yêu cầu loại bỏ am/pm (hoặc rút ngắn đến một/p) từ cuối. Nếu người dùng nhập (ví dụ tốt hơn) "8: 14mmmm" thì giải pháp của bạn sẽ trả về "8:14". Nhưng tôi cho rằng chuỗi không hợp lệ, vì "mmm" không phải là tên chỉ định hợp lệ. –

5

Tôi nghĩ rằng giải pháp BrokenGlass là một tốt nhất, nhưng cá nhân tôi sẽ thích để tạo ra ba phương pháp riêng biệt cho phép người dùng cắt chỉ bắt đầu, kết thúc hoặc cả hai.

Nếu những phiền phức này sẽ được sử dụng nhiều, tôi sẽ tạo chúng trong lớp trợ giúp và/hoặc làm phương pháp mở rộng; http://msdn.microsoft.com/en-gb/library/vstudio/bb383977.aspx

public string TrimStart(string inputText, string value, StringComparison comparisonType = StringComparison.CurrentCultureIgnoreCase) 
{ 
    if (!string.IsNullOrEmpty(value)) 
    { 
     while (!string.IsNullOrEmpty(inputText) && inputText.StartsWith(value, comparisonType)) 
     { 
      inputText = inputText.Substring(value.Length - 1); 
     } 
    } 

    return inputText; 
} 

public string TrimEnd(string inputText, string value, StringComparison comparisonType = StringComparison.CurrentCultureIgnoreCase) 
{ 
    if (!string.IsNullOrEmpty(value)) 
    { 
     while (!string.IsNullOrEmpty(inputText) && inputText.EndsWith(value, comparisonType)) 
     { 
      inputText = inputText.Substring(0, (inputText.Length - value.Length)); 
     } 
    } 

    return inputText; 
} 

public string Trim(string inputText, string value, StringComparison comparisonType = StringComparison.CurrentCultureIgnoreCase) 
{ 
    return TrimStart(TrimEnd(inputText, value, comparisonType), value, comparisonType); 
} 

Với các phương pháp này, chúng tôi có thể sửa đổi mã để lặp qua mảng chứa chuỗi cần cắt.

var content = "08:00 AM"; 
var removeList = new [] { "a", "am", "p", "pm" }; 

for (var i = 0; i < removeList.length; i++) 
{ 
    content = TrimEnd(content, removeList[i]); 
} 

LƯU Ý: Mã này có thể được tối ưu hóa hơn nữa, nhưng sẽ hoạt động với tốc độ tốt.

+3

Tôi khuyên bạn nên làm cho chúng mở rộng (sử dụng 'chuỗi đầu vào chuỗi này' làm đối số đầu tiên) và mặc định là không phân biệt chữ hoa chữ thường, vì C# mặc định là phân biệt chữ hoa chữ thường. – bradlis7

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