2009-03-31 36 views
13

Tôi có một ứng dụng được viết bằng C# có nhiều so sánh chuỗi. Các chuỗi được lấy từ nhiều nguồn khác nhau (bao gồm cả đầu vào của người dùng) và sau đó được so sánh. Tuy nhiên tôi đang gặp vấn đề khi so sánh không gian '32' với không gian không phá vỡ '160'. Đối với người dùng, họ trông giống nhau và vì vậy họ mong đợi một trận đấu. Nhưng khi ứng dụng thực hiện so sánh, không có kết quả phù hợp.So sánh chuỗi, .NET và không gian phá vỡ

Cách tốt nhất để giải quyết vấn đề này là gì? Tôi sẽ phải đi đến tất cả các phần của mã mà làm một chuỗi so sánh và bình thường hóa thủ công không phá vỡ không gian để không gian? NET có cung cấp bất cứ điều gì để giúp với điều đó không? (Tôi đã thử tất cả các tùy chọn so sánh nhưng dường như không có ích gì.)

Điều đó đã được gợi ý rằng tôi chuẩn hóa các chuỗi khi nhận và sau đó để phương thức so sánh chuỗi đơn giản so sánh các chuỗi chuẩn hóa. Tôi không chắc chắn nó sẽ được thẳng về phía trước để làm điều đó bởi vì những gì là một chuỗi bình thường ở nơi đầu tiên. Tôi làm gì bình thường hóa nó? Chắc chắn, bây giờ tôi có thể chuyển đổi không gian không phá vỡ để phá vỡ không gian. Nhưng những gì khác có thể hiển thị? Có khả năng có thể có rất nhiều các quy tắc này? Có thể họ thậm chí còn mâu thuẫn. (Trong một trường hợp tôi muốn sử dụng quy tắc và tôi không muốn sử dụng quy tắc này và tôi không sử dụng quy tắc này.)

+0

Bạn có thể chỉnh sửa câu hỏi của riêng bạn để thêm thông tin hoặc cung cấp làm rõ. –

Trả lời

9

Nếu là tôi, tôi sẽ 'bình thường hóa' các chuỗi khi tôi 'kéo chúng vào'; có lẽ với một string.Replace(). Sau đó, bạn sẽ không cần thay đổi các so sánh của mình ở bất kỳ nơi nào khác.

Chỉnh sửa: Đánh dấu, đó là một điều khó khăn. Nó thực sự tùy thuộc vào bạn, hoặc khách hàng của bạn, như là một chuỗi 'bình thường hóa'. Tôi đã ở trong tình huống tương tự nơi khách hàng yêu cầu các chuỗi đó như:

thực sự là bằng nhau. Bạn có thể cần bình thường riêng biệt cho các tình huống khác nhau. Dù bằng cách nào, tôi vẫn sẽ làm bình thường khi thu hồi các chuỗi gốc.

+0

Tôi sẽ làm điều đó. –

+0

Vâng, tôi sẽ bình thường hóa các chuỗi những gì bạn quan tâm với chức năng của riêng bạn mà gọi string.Replace và sau đó không so sánh. – NoahD

+0

Làm cách nào để tôi đăng câu hỏi tiếp theo hoặc câu hỏi làm rõ cho câu trả lời được đề xuất này? Tôi có làm ở đây không? Điều này chỉ cho phép 255 ký tự – Mark

29

Tôi đã trải qua rất nhiều đau đớn để tìm câu trả lời đơn giản này. Đoạn mã dưới đây sử dụng cụm từ thông dụng để thay thế các khoảng trống không gian bằng các khoảng trống thông thường.

string cellText = "String with non breaking spaces."; 
cellText = Regex.Replace(cellText, @"\u00A0", " "); 

Hope this helps, Dan

+10

Không phải @ dừng nhân vật thoát khỏi hoạt động? Không phải nó là cellText.Replace ("\ u00A0", "")? – jpmcclung

+8

@jpmcclung yes. Xem "Đối tượng Char và Ký tự Unicode" trong http://msdn.microsoft.com/en-us/library/system.string.aspx. FWIW, 'cellText.Thay thế ('\ u00A0', '') 'thậm chí còn nhanh hơn (http://www.dotnetperls.com/replace-performance) – Arithmomaniac

+2

FYI - cellText.Replace (@" \ u00A0 "," ") không hoạt động. Regex.Replace (cellText, @ "\ u00A0", ""); dường như là con đường để đi. – gpmurthy

1

tôi muốn khuyên bạn nên tạo Comparer chuỗi riêng bạn mà kéo dài là một trong những bản gốc - làm "bình thường" ở đó (thay thế khoảng trắng không bị phá vỡ với không gian thường xuyên) . Ngoài phương pháp Equals thể hiện, có một số String.Equals tĩnh cần so sánh.

0

Cùng không regex, chủ yếu là cho bản thân mình khi tôi cần nó sau này:

text.Replace(' ', '\u00A0')