2012-05-17 66 views
8

Tôi có một chuỗi mà phải nằm trong định dạng sau:chuỗi Validate dựa trên một định dạng

XXXX-XX-XXX-XXXX-XXXXXXXXXX-X

trong đó X là một số nguyên. Số lượng số nguyên không quan trọng. Tôi chỉ cần phải chắc chắn rằng chuỗi:

  • bắt đầu và kết thúc với một số nguyên
  • chỉ chứa số nguyên cách nhau bởi dấu gạch ngang

những gì sẽ là cách dễ nhất để xác nhận điều đó không?

+4

Cụm từ thông dụng sẽ thực hiện công việc. – ken2k

Trả lời

13

Regexp này nên làm các trick. Nó sử dụng số âm lookbehind để tránh khớp nhiều dấu gạch ngang trong một hàng.

^\d(\d|(?<!-)-)*\d$|^\d$ 

^  ^ ^^
|  |  | -- is a single digit, or 
|  |  ------- ends with a digit 
|  ----------------consists on digits or dashes not preceded by dashes 
---------------------starts with a digit 

Dưới đây là một mã C# để minh họa việc sử dụng nó (cũng trên ideone):

var r = new Regex("^\\d(\\d|(?<!-)-)*\\d$|^\\d$"); 
Console.WriteLine(r.IsMatch("1-2-3")); 
Console.WriteLine(r.IsMatch("1-222-3333")); 
Console.WriteLine(r.IsMatch("123")); 
Console.WriteLine(r.IsMatch("1-2-3-")); 
Console.WriteLine(r.IsMatch("1")); 
Console.WriteLine(r.IsMatch("-11-2-3-")); 
+0

bạn có thêm) trên câu trả lời của bạn. Chính xác sẽ là^\ d (\ d | (? Diego

+0

@Diego Bạn nói đúng, mẫu tôi liên kết tại ideone không có dấu ngoặc đơn phụ này. Tôi đã chỉnh sửa câu trả lời, cảm ơn! – dasblinkenlight

+0

Tôi chấp nhận câu trả lời của bạn bởi vì đó là một trong những người giao dịch với dasehs liên tiếp. cảm ơn rất nhiều – Diego

4

bạn có thể viết cụm từ thông dụng thực hiện thủ thuật.

hơn bạn có thể sử dụng biểu thức chính quy để xác nhận chuỗi của bạn

^ ---->Start of a string. 
$ ---->End of a string. 
. ----> Any character (except \n newline) 
{...}----> Explicit quantifier notation. 
[...] ---->Explicit set of characters to match. 
(...) ---->Logical grouping of part of an expression. 
* ---->0 or more of previous expression. 
+ ---->1 or more of previous expression. 
? ---->0 or 1 of previous expression; also forces minimal matching when an expression might match several strings within a search string. 
\ ---->Preceding one of the above, it makes it a literal instead of a special character. Preceding a special matching character, see below. 
\w ----> matches any word character, equivalent to [a-zA-Z0-9] 
\W ----> matches any non word character, equivalent to [^a-zA-Z0-9]. 
\s ----> matches any white space character, equivalent to [\f\n\r\v] 
\S----> matches any non-white space characters, equivalent to [^\f\n\r\v] 
\d ----> matches any decimal digits, equivalent to [0-9] 
\D----> matches any non-digit characters, equivalent to [^0-9] 

\a ----> Matches a bell (alarm) \u0007. 
\b ----> Matches a backspace \u0008 if in a [] character class; otherwise, see the note following this table. 
\t ---->Matches a tab \u0009. 
\r ---->Matches a carriage return \u000D. 
\v ---->Matches a vertical tab \u000B. 
\f ---->Matches a form feed \u000C. 
\n ---->Matches a new line \u000A. 
\e ---->Matches an escape \u001B 

$number ----> Substitutes the last substring matched by group number number (decimal). 
${name} ----> Substitutes the last substring matched by a (?) group. 
$$ ----> Substitutes a single "$" literal. 
$& ----> Substitutes a copy of the entire match itself. 
$` ----> Substitutes all the text of the input string before the match. 
$' ----> Substitutes all the text of the input string after the match. 
$+ ----> Substitutes the last group captured. 
$_ ----> Substitutes the entire input string. 

(?(expression)yes|no) ----> Matches yes part if expression matches and no part will be ommited. 
hơn

thông tin tại

http://geekswithblogs.net/brcraju/archive/2003/10/23/235.aspx

7

Sử dụng một biểu thức chính quy.

^\d[-0-9]+\d$ 

Giả định chuỗi dài ít nhất ba ký tự.

Breakdown:

^ - match start of string 
\d - match a digit 
[ - start of character class containing: 
-  - a dash 
0-9 - 0 to 9 
] - end of character class 
+ - match one or more of the previous 
\d - match a digit 
$ - match end of string 

Bạn có thể thay đổi +-* để làm cho 2 chuỗi chữ số hợp lệ, và thêm một thay đổi luân phiên để thực hiện 1 chuỗi chữ số có giá trị cũng như:

^(\d|\d[-0-9]*\d)$ 

Lưu ý: Trong .NET, \d sẽ khớp với bất kỳ số nào chữ số Unicode (ví dụ: chữ số Ả Rập sẽ khớp) - nếu bạn không muốn, hãy thay thế \d bằng [0-9] ở mọi nơi.

+0

+1 cảm ơn rất tốt. Chỉ có vấn đề là nó không hợp lệ 1 hoặc 12 – Diego

+0

@Diego - Không, tôi đã đăng giả định rằng điều này giả định 3 ký tự. Bạn có thể sử dụng luân phiên để khớp với 1 và 2 chữ số. Đã cập nhật câu trả lời. – Oded

+0

cảm ơn Oded. Chỉ cần cho thông tin của bạn, nó vẫn xác nhận 1--1 (dấu gạch ngang trong một hàng). Nhưng đó là tốt, dasblinkenlight đã được đăng một giải pháp làm việc. Cảm ơn một lần nữa vì đã dành thời gian của bạn – Diego

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