Regex только для чисел

224

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

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

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

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

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

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

  • 6
    Вам нужно сопоставить цифры или цифры ? Например: 123.456 - это число, но это не все цифры.
  • 0
    Точно, OP не совсем ясно об использовании целых чисел или нет
Показать ещё 4 комментария
Теги:
.net-2.0

17 ответов

349
Лучший ответ

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

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

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


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


Если вам нужно включить любые числовые представления, отличные от цифр (например, десятичные значения для стартеров), см. @tchrist подробное руководство по анализу чисел с регулярными выражениями.

  • 0
    Как насчет набора числовых значений? Это обычно так для почтовых индексов некоторых стран, таких как Индия. Я думаю, что после этого нам, возможно, придется проверить длину строки?
  • 2
    @Najeeb Да, так как индийские почтовые индексы состоят из 6 цифр, вы можете использовать что-то вроде "^\d{6}$" . В некоторых других странах существуют более сложные правила для почтовых индексов, поэтому решения для регулярных выражений для нескольких стран также могут быть довольно сложными. Посмотрите некоторые примеры на stackoverflow.com/q/578406/1288
Показать ещё 2 комментария
72

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

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

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

25

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

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

update: вам понадобится "-" , если число может пойти отрицательным. обновление: перемещено "-" в начало, чтобы избежать совпадения не запускающихся "-"

  • 0
    @ Флорин Гита. Благодарю. «-» должно быть в начале.
  • 13
    -,,....,.,..,,..,,. ?
Показать ещё 3 комментария
15

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

^\d+$
11

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

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

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

9

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

"^-?\\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

Вот мой рабочий:

^(-?[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"};

Проверено не только на С#, но также на Java, Javascript и PHP

  • 0
    »0,3" , "3". на самом деле хорошие цифры (то есть 0,3 и 3,0 соответственно). мы постоянно видим это в исходных системах, и большинство функций to_number (xx) языков, которые вы упомянули, распознают и конвертируют их правильно. Благодарю.
  • 1
    @ Руслан, ты прав, что во многих системах ".3", "3." будет анализировать действительное число и использовать, как вы упомянули "0,3" и "3,0". Но с другой стороны - это преобразованное значение, поэтому исходные значения «.3» и «3». на самом деле не существует номер.
7

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

[0-9]*

Для одной или нескольких цифр:

[0-9]+
6

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

^[0-9]+$

1425 ИСТИНА

0142 ИСТИНА

0 ИСТИНА

1 ИСТИНА

154a25 FALSE

1234 = 3254 ЛОЖЬ

4

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

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

Для сопоставления буквенного периода используйте:

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

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

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

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

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"

0

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

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

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

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

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

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

0

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

-1

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

  • 2
    Можете ли вы объяснить свой ответ немного, пожалуйста? Вы заметите, что другие ответы на этот вопрос имеют некоторый уровень объяснения того, что делает каждая часть регулярного выражения, чего вам не хватает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню