2009-09-08 27 views
52

biểu thức chính quy để xác nhận một phân danh sách dấu phẩy như thế này là gì:Regex cho Comma delimited danh sách

12365, 45236, 458, 1, 99996332, ...... 
+0

nhân vật Sẽ có bao giờ được thoát, như: '12365,45236, "Đây là một \" test ". ' – ceejayoz

+6

Tại sao nó phải là một regex? Tùy thuộc vào ngôn ngữ, bạn có thể sử dụng một trình phân tích cú pháp CSV được tích hợp sẵn tốt hơn –

Trả lời

86

Tôi đề nghị bạn làm theo cách sau:

(\d+)(,\s*\d+)* 

mà sẽ làm việc cho một danh sách có chứa 1 hoặc nhiều phần tử.

+1

bạn nói đúng, tôi đã phải tách một ký tự đầu tiên trước khi tôi có thể sử dụng regex, cảm ơn tất cả vì đã giúp đỡ – everLearningStudent

+0

điều này dường như chỉ hoạt động với dấu phẩy đầu tiên ... – ondrobaco

+0

@ondrobaco: Bạn có lẽ chỉ kiểm tra nhóm đối sánh đầu tiên. Nhóm đối sánh tiếp theo sẽ chứa phần còn lại của danh sách. – Asaph

6

trận đấu lặp lại mục dấu phẩy phân cách:

(?<=,|^)([^,]*)(,\1)+(?=,|$) 

Reference.

Regex này có thể được sử dụng để chia các giá trị của danh sách được phân tách bằng dấu phẩy. Các phần tử danh sách có thể được trích dẫn, không được trích dẫn hoặc trống. Các dấu phẩy bên trong một cặp dấu ngoặc kép không khớp.

,(?!(?<=(?:^|,)\s*"(?:[^"]|""|\\")*,)(?:[^"]|""|\\")*"\s*(?:,|$)) 

Reference.

+0

Biểu tượng đường ống (|) đang làm gì ở đây? trang bạn liên kết đến, và tôi không thể hiểu được nó –

+0

@ThomasVanderStichele: Nó là để thay đổi '(foo | bar)' khớp với 'foo' hoặc' bar'. Để biết thêm thông tin: http: // www. regular-expressions.info/alternation.html –

1

Bạn có thể muốn xác định ngôn ngữ chỉ để được an toàn, nhưng

(\d+, ?)+(\d+)? 

nên làm việc

+1

Giải pháp này không thành công cho danh sách chứa chỉ 1 phần tử. Xem giải pháp của tôi dưới đây. – Asaph

6

Nó phụ thuộc một chút về các yêu cầu chính xác của bạn. Tôi giả sử: tất cả các số, bất kỳ độ dài nào, các số không thể có các số 0 đứng đầu cũng như không chứa dấu phẩy hoặc dấu thập phân. các số riêng biệt luôn được phân tách bằng dấu phẩy rồi một khoảng trắng và số cuối cùng KHÔNG có dấu phẩy và dấu cách sau dấu phẩy. Bất kỳ trong số này là sai sẽ đơn giản hóa các giải pháp.

([1-9][0-9]*,[ ])*[1-9][0-9]*

Đây là cách tôi xây dựng mà tinh thần:

[0-9] any digit. 
[1-9][0-9]* leading non-zero digit followed by any number of digits 
[1-9][0-9]*, as above, followed by a comma 
[1-9][0-9]*[ ] as above, followed by a space 
([1-9][0-9]*[ ])* as above, repeated 0 or more times 
([1-9][0-9]*[ ])*[1-9][0-9]* as above, with a final number that doesn't have a comma. 
+0

cảm ơn cho hướng dẫn nhanh – everLearningStudent

+0

Tôi thấy câu trả lời này thực sự hữu ích, chỉ cần một chút tinh chỉnh để chấp nhận khoảng trắng trước và sau dấu phẩy '([1-9] [0-9] * [] *, [] *) * [1-9] [0-9] * '... có lẽ ai đó sẽ tìm thấy điều này hữu ích – pollirrata

+0

Tôi thích ví dụ này là tốt nhất, làm thế nào tôi có thể cho phép ngắt dòng sau này? – justinpees

2

tôi đã sử dụng tính năng này cho danh sách các mục phải có chữ và số mà không có dấu gạch dưới ở trước mỗi mục.

^(([0-9a-zA-Z][0-9a-zA-Z_]*)([,][0-9a-zA-Z][0-9a-zA-Z_]*)*)$ 
1

Tôi đã có một yêu cầu hơi khác nhau, để phân tích một cuốn từ điển mã hóa/Hashtable bằng dấu phẩy trốn thoát, như thế này:

"1=This is something, 2=This is something,,with an escaped comma, 3=This is something else" 

Tôi nghĩ rằng đây là một giải pháp thanh lịch, với một thủ thuật mà tránh được rất nhiều của regex phức tạp:

if (string.IsNullOrEmpty(encodedValues)) 
{ 
    return null; 
} 
else 
{ 
    var retVal = new Dictionary<int, string>(); 
    var reFields = new Regex(@"([0-9]+)\=(([A-Za-z0-9\s]|(,,))+),"); 
    foreach (Match match in reFields.Matches(encodedValues + ",")) 
    { 
     var id = match.Groups[1].Value; 
     var value = match.Groups[2].Value; 
     retVal[int.Parse(id)] = value.Replace(",,", ","); 
    } 
    return retVal; 
} 

tôi nghĩ rằng nó có thể được điều chỉnh cho câu hỏi ban đầu với một biểu thức như @"([0-9]+),\s?" và phân tích trên Groups[0].

Tôi hy vọng nó hữu ích cho một ai đó và cảm ơn những lời khuyên về việc đưa nó đến gần đó, đặc biệt là Asaph!

1

Điều này sẽ từ chối các dấu phẩy không liên quan ở đầu hoặc cuối dòng, nếu điều đó quan trọng đối với bạn.

((,)?(^)?(possible|value|patterns))* 

thay thế possible|value|patterns bằng regex khớp với giá trị được phép của bạn.

5

regex này chiết xuất một phần tử từ một danh sách dấu phẩy tách ra, bất kể nội dung:

(.+?)(?:,|$) 

Nếu bạn chỉ cần thay thế các dấu phẩy với cái gì khác, nó cũng làm việc cho bất kỳ dấu phân cách.

+0

Nó có trích xuất nhiều hơn một phần tử không? – paranza

+0

Cảm ơn rất hữu ích! – mt81

+0

Điều này thật tuyệt! Cảm ơn! – dabito

0

Trong JavaScript, sử dụng split để giúp đỡ, và bắt bất kỳ chữ số tiêu cực cũng như:

'-1,2,-3'.match(/(-?\d+)(,\s*-?\d+)*/)[0].split(','); 
// ["-1", "2", "-3"] 
// may need trimming if digits are space-separated