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 - це число, але це не всі цифри.
Joel Coehoorn

Точно ОП не зовсім зрозуміло щодо використання цілих чисел чи ні
Sune Rievers

3
Чому б не TryParse рядок для цього простого випадку? bool decimal.TryParse (string string, out decimal result) або bool int.TryParse (string string, out int result)
Макач

Подивіться на цю відповідь для остаточного трактування чисел з регулярними виразами.
tchrist

1
Загалом, найпростіший спосіб усунення виразів Regex, на мою думку, - це за допомогою інтерпретатора командного рядка, якщо ваша мова дозволяє (здається, що це робить більшість). Оскільки цей приклад знаходиться в C #, ви можете використовувати linqpad.net , або ви можете використати точку розриву на відладці , а потім використати вікно Негайного в VS як CLI.
andrew

Відповіді:


478

Використовуйте початкові та кінцеві анкери.

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

Використовуйте, "^\d+$"якщо вам потрібно відповідати більше однієї цифри.


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


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


Як щодо заданої кількості числових значень? Зазвичай це стосується поштових індексів певних країн, таких як Індія. Напевно, після цього нам, можливо, доведеться перевірити довжину рядка?
Najeeb

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,\.]+$");

Вам знадобиться "-", якщо число може бути від’ємним.


@Florin Ghita. Дякую. "-" має бути на початку.
Енді

3
Цей регулярний вираз також помилково дозволяє ведучому негативному знаку ( -) та періоду ( .) виникати не один раз.
DavidRR

5
ви можете зробити -і .необов’язково через ?. -?\d+(?:\.\d+)?відповідали б цілим чи десятковим числам. ( ?:Парень просто робить
парен негруповою

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


".3", "3". насправді хороші числа (значення відповідно 0,3 і 3,0). ми бачимо це весь час у вихідних системах, і більшість функцій to_number (xx) мов, які ви згадали, розпізнають та перетворюють їх правильно. Дякую.
Тагар

1
@Ruslan ви праві, що в багатьох системах ".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
Це найповніше рішення. Вітаю!
Ренато Медейрос

2

Я думаю, що цей варіант є найпростішим, і він приймає європейський та американський спосіб запису цифр, наприклад, США 10,555.12 Європейський 10.555,12 Також цей не дозволяє декілька косів чи крапок одна за одною, наприклад, 10..22 або 10, .22 Окрім цих цифр, як .55 або, 55 пропустили б. Це може бути зручно.

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


-4

Regex regex = новий Regex ("^ [0-9] {1,4} = [0-9] {1,4] $")


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