Regex chỉ cho số


309

Tôi chưa sử dụng biểu thức chính quy nào cả, vì vậy tôi gặp khó khăn khi khắc phục sự cố. Tôi muốn regex chỉ khớp khi chuỗi chứa là tất cả các số; nhưng với hai ví dụ bên dưới, nó khớp với một chuỗi chứa tất cả các số cộng với một dấu bằng như "1234 = 4321". Tôi chắc chắn có một cách để thay đổi hành vi này, nhưng như tôi đã nói, tôi chưa bao giờ thực sự làm được gì nhiều với các biểu thức thông thường.

string compare = "1234=4321";
Regex regex = new Regex(@"[\d]");

if (regex.IsMatch(compare))
{ 
    //true
}

regex = new Regex("[0-9]");

if (regex.IsMatch(compare))
{ 
    //true
}

Trong trường hợp có vấn đề, tôi đang sử dụng C # và .NET2.0.


6
Bạn có cần phải khớp số hoặc chữ số ? Ví dụ: 123.456 là một số, nhưng nó không phải là tất cả các chữ số.
Joel Coehoorn

Chính xác, OP không hoàn toàn rõ ràng về việc sử dụng số nguyên hay không
Sune Rievers

3
Tại sao không dùng thử chuỗi cho trường hợp đơn giản đó? bool binary.TryPude (chuỗi chuỗi, kết quả thập phân) hoặc bool int.TryPude (chuỗi chuỗi, kết quả int)
Makach

Nhìn vào câu trả lời này để biết cách xử lý dứt khoát các số phân tích cú pháp với các biểu thức thông thường.
tchrist

1
Nói chung, cách dễ nhất để khắc phục các biểu thức Regex, theo ý kiến ​​của tôi, là sử dụng trình thông dịch dòng lệnh, nếu ngôn ngữ của bạn cho phép nó (dường như hầu hết đều làm như vậy). Vì ví dụ này là trong C #, bạn có thể sử dụng linqpad.net hoặc bạn có thể sử dụng điểm dừng trong trình gỡ lỗi và sau đó sử dụng cửa sổ Ngay lập tức trong VS làm CLI.
andrew

Câu trả lời:


478

Sử dụng các neo bắt đầu và kết thúc.

Regex regex = new Regex(@"^\d$");

Sử dụng "^\d+$"nếu bạn cần khớp nhiều hơn một chữ số.


Lưu ý rằng "\d"sẽ khớp [0-9]và các ký tự chữ số khác như chữ số Đông Ả Rập ٠١٢٣٤٥٦٧٨٩. Sử dụng "^[0-9]+$"để hạn chế kết quả khớp với các chữ số Ả Rập 0 - 9.


Nếu bạn cần bao gồm bất kỳ biểu diễn số nào ngoài các chữ số (như giá trị thập phân cho người mới bắt đầu), hãy xem hướng dẫn toàn diện của @tchrist để phân tích số bằng các biểu thức thông thường .


Làm thế nào về một số lượng các giá trị số? Điều này thường là như vậy đối với mã bưu chính của một số quốc gia như Ấn Độ. Tôi đoán chúng ta có thể phải kiểm tra độ dài chuỗi sau này?
Najeeb

2
@Najeeb Có, vì mã zip Ấn Độ là số có 6 chữ số, bạn có thể sử dụng một cái gì đó như "^\d{6}$". Một số quốc gia khác có các quy tắc phức tạp hơn đối với mã zip, vì vậy các giải pháp regex cho nhiều quốc gia cũng có thể trở nên khá phức tạp. Kiểm tra một số ví dụ tại stackoverflow.com/q/578406/1288
Bill the Lizard

Tại sao nếu chuỗi đầu vào giống như: "3 a" thì nó vẫn khớp? Có ai biết làm thế nào tôi có thể làm cho nó khớp CHỈ nếu có số, và không có gì khác (ngoại trừ một dấu hiệu tiêu cực tôi cho là). Tôi hiện đang cài đặt nó như thế này "-? [0-9] +".
Matthew

105

Regex của bạn sẽ khớp với bất cứ thứ gì có chứa một số, bạn muốn sử dụng các neo để khớp với toàn bộ chuỗi và sau đó khớp với một hoặc nhiều số:

regex = new Regex("^[0-9]+$");

Ý ^chí neo phần đầu của chuỗi, ý $chí neo phần cuối của chuỗi và +sẽ khớp với một hoặc nhiều phần trước chuỗi (một số trong trường hợp này).


38

Nếu bạn cần dung sai dấu thập phân và dấu nghìn

var regex = new Regex(@"^-?[0-9][0-9,\.]+$");

Bạn sẽ cần "-", nếu số có thể âm.


@Florin Ghita. Cảm ơn. "-" cần phải ở đầu.
Andy

3
Regex này cũng sai cho phép dấu âm ( -) và period ( .) hàng đầu xảy ra nhiều lần.
DavidRR

5
bạn có thể thực hiện -.tùy chọn thông qua ?. -?\d+(?:\.\d+)?sẽ khớp với số nguyên hoặc số thập phân. (Các ?:parens chỉ làm cho các parens trở thành một nhóm không bị bắt và được sử dụng để chỉ nhóm cho rõ ràng.)
butterywombat

2
Nó không thành công cho các trường hợp cạnh như 1, 0,5, nhưng nếu bạn giám sát điều đó. Tuy nhiên, nó vẫn thất bại đối với các trường hợp cơ bản như -2. Hãy thay đổi nó để ^-?[0-9][0-9,\.]*$tránh thất bại cho trường hợp cơ bản. + được thay thế bằng *
PrivateOmega

Một kịch bản tôi đang thiếu ở đây là ký hiệu Kỹ thuật (1.2345e-4) có gợi ý nào về điều đó không?
WolfiG

18

Nó phù hợp bởi vì nó đang tìm "khớp" không khớp với chuỗi đầy đủ. Bạn có thể khắc phục điều này bằng cách thay đổi biểu thức chính quy của bạn để tìm kiếm cụ thể phần đầu và phần cuối của chuỗi.

^\d+$

16

Có lẽ phương pháp của tôi sẽ giúp bạn.

    public static bool IsNumber(string s)
    {
        return s.All(char.IsDigit);
    }

3
Hãy ghi nhớ mặc dù Char.IsDigittrả về truecho bất kỳ ký tự nào là thành viên của danh mục UnicodeC Category.DecimalDigitNumber. Đây có thể không phải là những gì OP muốn. Ngoài ra hãy xem Tại sao Char.IsDigit trả về true cho các ký tự không thể được phân tích cú pháp thành int? .
DavidRR


16

Điều này hoạt động với số nguyên và số thập phân. Nó không khớp nếu số có dấu phân cách hôn mê nghìn,

"^-?\\d*(\\.\\d+)?$"

một số chuỗi phù hợp với điều này:

894
923.21
76876876
.32
-894
-923.21
-76876876
-.32

một số chuỗi không:

hello
9bye
hello9bye
888,323
5,434.3
-8,336.09
87078.

11

^ \ d + $, đó là "bắt đầu chuỗi", "1 hoặc nhiều chữ số", "cuối chuỗi" bằng tiếng Anh.


10

Nếu bạn cần kiểm tra xem tất cả các chữ số có phải là số (0-9) hay không,

^[0-9]+$

1425 THẬT

0142 THẬT

0 THẬT

1 ĐÚNG

154a25 SAU

1234 = 3254 SAU


10

Đây là công việc của tôi:

^(-?[1-9]+\\d*([.]\\d+)?)$|^(-?0[.]\\d*[1-9]+)$|^0$

Và một số bài kiểm tra

Xét nghiệm dương tính:

string []goodNumbers={"3","-3","0","0.0","1.0","0.1","0.0001","-555","94549870965"};

Xét nghiệm âm tính:

string []badNums={"a",""," ","-","001","-00.2","000.5",".3","3."," -1","--1","-.1","-0"};

Đã kiểm tra không chỉ cho C #, mà còn với Java, Javascript và PHP


".3", "3." là những con số thực sự tốt (có nghĩa là 0,3 và 3.0 tương ứng). chúng ta thấy điều này mọi lúc trong các hệ thống nguồn và hầu hết các hàm to_number (xx) của các ngôn ngữ bạn đã đề cập sẽ nhận ra và hội tụ chúng một cách chính xác. cảm ơn.
Tagar

1
@Ruslan bạn nói đúng rằng trong nhiều hệ thống ".3", "3." sẽ phân tích thành số hợp lệ và được sử dụng như bạn đã đề cập "0,3" và "3.0". Nhưng mặt khác - đó là giá trị được chuyển đổi , vì vậy giá trị ban đầu ".3" và "3." không thực sự là số hiện có.
Bến du thuyền K.

9

Xin lỗi vì định dạng xấu. Đối với bất kỳ số chữ số:

[0-9]*

Đối với một hoặc nhiều chữ số:

[0-9]+

7

Mặc dù các giải pháp trên không phù hợp với mục đích của tôi, nhưng điều này hiệu quả với tôi.

var pattern = @"^(-?[1-9]+\d*([.]\d+)?)$|^(-?0[.]\d*[1-9]+)$|^0$|^0.0$";
return Regex.Match(value, pattern, RegexOptions.IgnoreCase).Success;

Ví dụ về các giá trị hợp lệ: "3", "-3", "0", "0.0", "1.0", "0.7", "690.7", "0.0001", "-555", "945465464654"

Ví dụ về các giá trị không hợp lệ: "a", "", "", ".", "-", "001", "00.2", "000.5", ".3", "3.", "-1" , "--1", "-.1", "-0", "00099", "099"


4

Một cách khác: Nếu bạn muốn khớp các số quốc tế như tiếng Ba Tư hoặc tiếng Ả Rập, vì vậy bạn có thể sử dụng biểu thức sau:

Regex = new Regex(@"^[\p{N}]+$");

Để phù hợp với sử dụng ký tự thời kỳ nghĩa đen:

Regex = new Regex(@"^[\p{N}\.]+$");

4

sử dụng neo bắt đầu và kết thúc.

 Regex regex = new Regex(@"^\d$");
 Use "^\d+$" if you need to match more than one digit.

3

Regex cho số nguyên và số dấu phẩy động:

^[+-]?\d*\.\d+$|^[+-]?\d+(\.\d*)?$

Một số có thể bắt đầu bằng một khoảng thời gian (không có chữ số đầu (s)) và một số có thể kết thúc bằng dấu chấm (không có chữ số cuối (s)). Regex ở trên sẽ nhận ra cả hai là số chính xác.

A. (dấu chấm) tự nó không có bất kỳ chữ số nào không phải là một số chính xác. Đó là lý do tại sao chúng ta cần hai phần regex ở đó (được phân tách bằng dấu "|").

Hi vọng điêu nay co ich.


1
Đây là giải pháp đầy đủ nhất. Chúc mừng!
Renato Medeiros

2

Tôi nghĩ rằng cái này là cách đơn giản nhất và nó chấp nhận cách viết số của Châu Âu và Hoa Kỳ, ví dụ: Hoa Kỳ 10,555,12 Ngoài những con số như 0,55 hoặc 55 sẽ vượt qua. Điều này có thể có ích.

^([,|.]?[0-9])+$

1

Nếu bạn muốn chỉ trích xuất các số từ một chuỗi, mẫu "\ d +" sẽ có ích.


-4

Regex regex = Regex mới ("^ [0-9] {1,4} = [0-9] {1,4] $")


5
Bạn có thể giải thích câu trả lời của bạn một chút xin vui lòng? Bạn sẽ nhận thấy rằng các câu trả lời khác cho câu hỏi này có một số mức độ giải thích về những gì từng phần của regex làm, mà bạn đang thiếu.
Ái Hà Lee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.