2010-07-07 30 views
8

Tôi có một chuỗi như "AAA 101 B202 C 303" và tôi muốn loại bỏ khoảng trống giữa char và số nếu có. Vì vậy, sau khi hoạt động, chuỗi phải giống như "AAA101 B202 C303". Nhưng tôi không chắc liệu regex có thể làm được điều này không?Sự cố khớp mẫu trong C#

Bất kỳ trợ giúp nào? Cảm ơn trước.

Trả lời

8

Có, bạn có thể thực hiện việc này bằng cụm từ thông dụng. Dưới đây là một ví dụ ngắn nhưng đầy đủ:

using System; 
using System.Text.RegularExpressions; 

class Test 
{ 
    static void Main() 
    { 
     string text = "A 101 B202 C 303 "; 
     string output = Regex.Replace(text, @"(\p{L}) (\d)", @"$1$2"); 
     Console.WriteLine(output); // Prints A101 B202 C303 
    } 
} 

(. Nếu bạn đang đi để làm điều này rất nhiều, bạn cũng có thể muốn biên dịch biểu thức chính quy cho mô hình)

Các \p{L} trận đấu bất kỳ thư unicode - bạn có thể muốn hạn chế hơn.

1

Bạn có thể làm một cái gì đó giống như

([A-Z]+)\s?(\d+) 

Và thay thế với

$1$2 

Biểu thức có thể được thắt chặt lên, nhưng ở trên nên làm việc cho chuỗi ví dụ đầu vào của bạn.

Những gì nó làm là khai báo một nhóm có chứa các chữ cái (tập đầu tiên của các dấu ngoặc đơn), sau đó một không gian tùy chọn (\ s?), Và sau đó là một nhóm các chữ số (\ d +). Các nhóm có thể được sử dụng thay thế bằng cách tham chiếu đến chỉ mục của chúng, vì vậy khi bạn muốn loại bỏ không gian, chỉ cần thay thế bằng $ 1 $ 2.

+1

Tại sao tạo không gian tùy chọn? Sau khi tất cả, đó là những gì tất cả về. –

0

Trong khi không phải càng ngắn gọn càng Regex, C# mã cho một cái gì đó như thế này là khá đơn giản và rất nhanh chạy:

StringBuilder sb = new StringBuilder(); 
for(int i=0; i<s.Length; i++) 
{ 
    // exclude spaces preceeded by a letter and succeeded by a number 
    if(!(s[i] == ' ' 
     && i-1 >= 0 && IsLetter(s[i-1]) 
     && i+1 < s.Length && IsNumber(s[i+1]))) 
    { 
     sb.Append(s[i]); 
    } 
} 
return sb.ToString(); 
0

Just for fun (vì hành động của chương trình là/nên được vui vẻ đôi khi) : o) Tôi đang sử dụng LINQ với Aggregate:

var result = text.Aggregate(
string.Empty, 
(acc, c) => char.IsLetter(acc.LastOrDefault()) && Char.IsDigit(c) ? 
acc + c.ToString() : acc + (char.IsWhiteSpace(c) && char.IsLetter(acc.LastOrDefault()) ? 
string.Empty : c.ToString())).TrimEnd();