2008-11-07 1 views
226

Я вообще не использовал регулярные выражения, поэтому у меня возникли проблемы с поиском и устранением неисправностей. Я хочу, чтобы регулярное выражение соответствовало только тогда, когда строка содержала все числа; но с двумя приведенными ниже примерами он соответствует строке, содержащей все числа плюс знак равенства, такой как «1234 = 4321». Я уверен, что есть способ изменить это поведение, но, как я уже сказал, я никогда не делал многого с регулярными выражениями.Regex только для чисел

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

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

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

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

В случае, если это имеет значение, я использую C# и .NET2.0.

+3

Почему бы не TryParse строку для этого простого случая? bool decimal.TryParse (строка string, out decimal result) или bool int.TryParse (строка string, out int result) – Makach 2010-11-03 09:55:28

+0

Try.Parse будет принимать знак плюса или минуса в начале и в передних/конечных пробелах. – 2011-01-24 10:40:43

+5

Вам нужно совместить _numbers_ или _digits_? Например: 123.456 - это число, но это не все цифры. – 2008-11-07 18:54:13

ответ

379

Используйте начальные и концевые анкеры.

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

Используйте "^\d+$", если вам нужно сопоставить более одной цифры.


Обратите внимание, что "\d" будет соответствовать [0-9] и другие цифры символы, такие как Восточно-арабскими цифрами ٠١٢٣٤٥٦٧٨٩. Используйте "^[0-9]+$" ограничить матчи только арабские цифры 0 - 9.


Если вам необходимо включить любые другие, чем просто цифры (например, десятичных значения для начала) числовых представлений, то см @tchrist «s comprehensive guide to parsing numbers with regular expressions.

15

Это совпадение, потому что оно находит «соответствие» не совпадением полной строки. Вы можете исправить это, изменив ваше регулярное выражение, чтобы, в частности, искать начало и конец строки.

^\d+$ 
80

Вашего регулярное выражение будет соответствовать все, что содержит ряд, вы хотите использовать якоря, чтобы соответствовать всей строке, а затем сопоставить один или несколько номеров:

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

^ якоря в начале string, $ будет привязывать конец строки, а + будет соответствовать одному или нескольким из предшествующих ему (число в этом случае).

11

^\ d + $, который является «началом строки», «1 или более цифр», «конец строки» на английском языке.

0

Если вы хотите извлечь только цифры из строки, вам поможет шаблон «\ d +».

24

, если вам нужно терпеть десятичную точку и тысячи маркер ...

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

обновление: вам нужно будет «-», если число может стать отрицательным. обновление: переехал «-» в начале, чтобы избежать согласования без запуска «-»

4

Другой способ: Если вы хотите, чтобы соответствовать международные номера, такие как персидский или арабский, так что вы можете использовать следующее выражение:

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

Чтобы соответствовать буквальное использование период символов:

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

Возможно, мой метод поможет вам.

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

Это работает с целыми числами и десятичными числами. Это не соответствует, если число имеет разделитель кома тысяч,

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

несколько строк, который соответствует с этим:

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

некоторые строки, которые не:

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

К сожалению для уродливого форматирования. Для любого количества цифр:

[0-9]* 

Для одного или более цифр:

[0-9]+ 
6

Если вам нужно проверить, если все цифры (0-9) или нет,

^[0-9]+$ 

1425 ИСТИНА

0142 ИСТИНА

0 ИСТИНА

1 ИСТИНА

154a25 ЛОЖЬ

1234 = 3254 ЛОЖЬ

-1

Regex регулярное выражение = новый Regex ("^ [0-9] {1,4} = [0- 9] {1,4] $ ")

8

Вот мой работает один:

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

И некоторые тесты

Положительные тесты:

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

Отрицательные тесты:

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

проверяемые не только для C#, но и с Java, JavaScript и PHP

0

Regex для целочисленных и точечных леях и иностранной валюте чисел:

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

Число может начинаться с периода (без ведущих цифр (цифр)), и число может заканчиваться периодом (без конечных цифр (цифр)). Выше регулярное выражение распознает как правильные цифры. A. (период) без каких-либо цифр не является правильным числом. Вот почему нам нужны две регулярные части (разделенные «|»).

Надеюсь, это поможет.

3

использование начало и конец якоря.

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

Я думаю, что это один из самых простых, и он принимает европейский и американский способ записи чисел, например. USA 10,555.12 European 10.555,12 Также это не позволяет нескольким запятым или точкам один за другим, например. 10..22 или 10, .22 В дополнение к этим номерам, например .55 или, 55, будет проходить. Это может быть удобно.

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

Хотя не указанные выше решения не соответствовали моей цели, это сработало для меня.

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

Пример допустимых значений: "3", "-3", "0", "0.0", "1,0", "0.7", "690,7", " 0,0001" , "-555", "945465464654"

Пример не допустимых значений: "а", "", "", "", "-", "001", "00,2", "000,5", "0,3" , "3", "-1", "--1", "± 1", " - 0 ", " 00099 ", " 099 "

 Смежные вопросы

  • Нет связанных вопросов^_^