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


309

Я вообще не использовал регулярные выражения, поэтому у меня возникают проблемы с устранением неполадок. Я хочу, чтобы регулярное выражение совпадало только тогда, когда содержащаяся строка содержит все числа; но с двумя примерами ниже это соответствует строке, которая содержит все числа плюс знак равенства, такой как «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
}

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


6
Вам нужно сопоставить цифры или цифры ? Например: 123.456 - это число, но это не все цифры.
Джоэл Коухорн

Точно, OP не совсем ясно об использовании целых чисел или нет
Sune Rievers

3
Почему бы не попробовать строку для этого простого случая? bool decimal.TryParse (строковая строка, без десятичного результата) или bool int.TryParse (строковая строка, без целого результата)
Makach

Посмотрите на этот ответ для точного анализа чисел с помощью регулярных выражений.
2010 года

1
В общем, самый простой способ устранения неполадок в выражениях Regex, на мой взгляд, это использование интерпретатора командной строки, если ваш язык это позволяет (кажется, что большинство так и делают). Так как этот пример находится на C #, вы можете использовать linqpad.net или точку останова в отладчике, а затем использовать окно Immediate в VS в качестве CLI.
Андрей

Ответы:


478

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

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

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


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


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


Как насчет установленного количества числовых значений? Это обычно так для почтовых индексов некоторых стран, таких как Индия. Я думаю, что после этого нам, возможно, придется проверить длину строки?
Наджиб

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

Как получится, если входная строка будет выглядеть примерно так: «3 a», она все равно будет совпадать? Кто-нибудь знает, как я могу заставить его соответствовать ТОЛЬКО, если есть числа, и ничего больше (кроме отрицательного знака, я полагаю). Я в настоящее время настроил это как "-? [0-9] +".
Мэтью

105

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

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

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


38

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

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

Вам понадобится «-», если число может стать отрицательным.


@ Флорин Гита. Спасибо. «-» должно быть в начале.
Энди

3
Это регулярное выражение также ошибочно допускает повторение начального отрицательного знака ( -) и period ( .) более одного раза.
DavidRR

5
Вы можете сделать -и по .желанию через ?. -?\d+(?:\.\d+)?будет соответствовать целым или десятичным числам. (Символ « ?:в паранах» просто делает их не захватывающими группами и используется только для ясности.)
butterywombat,

2
Это не подходит для крайних случаев, таких как 1, .5, но если вы наблюдаете за этим. тем не менее это не удается для основных случаев, таких как -2. Пожалуйста, измените его, чтобы ^-?[0-9][0-9,\.]*$избежать сбоев в базовом случае. + заменено на *
PrivateOmega

Один из сценариев, который мне здесь не хватает, - это инженерная нотация (1.2345e-4).
WolfiG

18

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

^\d+$

16

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

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

3
Имейте в виду, что это Char.IsDigitвозвращает trueдля любого символа, который является членом категории UnicodeCategory.DecimalDigitNumber . Это может быть не то, что хочет ОП. Также см. Почему Char.IsDigit возвращает true для символов, которые не могут быть проанализированы в int? ,
DavidRR


16

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

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

некоторые строки, которые соответствуют этому:

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

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

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


10

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

^[0-9]+$

1425 ИСТИНА

0142 ИСТИНА

0 ИСТИНА

1 ИСТИНА

154a25 ЛОЖЬ

1234 = 3254 ЛОЖЬ


10

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

^(-?[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,3" , "3" . на самом деле хорошие цифры (то есть 0,3 и 3,0 соответственно). мы видим это все время в исходных системах, и большинство функций to_number (xx) языков, которые вы упомянули, распознают и конвертируют их правильно. Спасибо.
Тагар

1
@ Руслан, ты прав, что во многих системах ".3", "3." будет анализировать действительное число и использовать, как вы упомянули "0,3" и "3,0". Но с другой стороны - это преобразованное значение, поэтому исходные значения «.3» и «3». на самом деле не существует номер.
Марина К.

9

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

[0-9]*

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

[0-9]+

7

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

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"

Пример недопустимых значений: "a", "", "", ".", "-", "001", "00.2", "000.5", ".3", "3.", "-1" , "--1", "-.1", "-0", "00099", "099"


4

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

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

Чтобы соответствовать буквенному символу точки, используйте:

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


3

Регулярное выражение для целых чисел и чисел с плавающей точкой:

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

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

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

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


1
Это наиболее полное решение. Congrats!
Ренато Медейрос

2

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

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


-4

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


5
Можете ли вы объяснить свой ответ немного, пожалуйста? Вы заметите, что другие ответы на этот вопрос имеют некоторый уровень объяснения того, что делает каждая часть регулярного выражения, чего вам не хватает.
Вай Ха Ли
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.