Регулярное выражение только для чисел

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

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

Makach 03.11.2010 12:55

Try.Parse примет знак плюс или минус в начале и ведущие / конечные пробелы.

Robin Bennett 24.01.2011 13:40

Вам нужно сопоставить числа или цифры? Например: 123,456 - это число, но это не все цифры.

Joel Coehoorn 07.11.2008 21:54

Точно, OP не совсем понимает, использовать целые числа или нет

Sune Rievers 13.12.2009 02:26

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

tchrist 23.11.2010 17:53

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

andrew 18.02.2015 22:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
344
6
939 737
18
Перейти к ответу Данный вопрос помечен как решенный

Ответы 18

Ответ принят как подходящий

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

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

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


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


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

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

Najeeb 13.03.2018 13:59

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

Bill the Lizard 13.03.2018 15:15

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

Matthew 23.12.2018 01:45

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

^\d+$

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

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

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

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

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

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

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

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

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

Andy 20.03.2013 02:38

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

DavidRR 09.04.2014 18:36

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

butterywombat 29.09.2014 20:10

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

PrivateOmega 12.01.2019 12:30

Один сценарий, который мне здесь не хватает, - это инженерная нотация (1.2345e-4). Любое предложение по этому поводу?

WolfiG 13.06.2019 11:53

не соответствует "0"

Sadiq Khoja 25.03.2020 20:40

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

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

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

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

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

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

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

DavidRR 09.04.2014 19:05

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

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

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

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

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

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

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

[0-9]*

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

[0-9]+

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

^[0-9]+$

1425 ИСТИНА

0142 ИСТИНА

0 ИСТИНА

1 ИСТИНА

154a25 ЛОЖЬ

1234 = 3254 ЛОЖЬ

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

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

Wai Ha Lee 02.05.2015 02:23

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

^(-?[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) упомянутых вами языков распознают и правильно их преобразуют. благодаря.

Tagar 22.02.2016 08:31

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

Marina 22.02.2016 23:17

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

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

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

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

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

Это наиболее полное решение. Поздравляю!

Renato Medeiros 19.05.2020 01:04

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

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

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

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

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

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

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», ".3", «3.», «-1», «--1», "-.1", «-0», «00099», «099»

Вы можете дать мне более подробную информацию, потому что это раскрывает ошибку

Eduardo Herrera 24.10.2020 01:55

я поставил textbox_changed

Eduardo Herrera 24.10.2020 01:55

private void textBox2_TextChanged (отправитель объекта, EventArgs e) {var pattern = @ "^ (-? [1-9] + \ d * ([.] \ d +)?) $ | ^ (-? 0 [.] \ d * [1-9] +) $ | ^ 0 $ | ^ 0.0 $ "; вернуть Regex.Match (textBox1.Text, pattern, RegexOptions.IgnoreCase) .Success; }

Eduardo Herrera 24.10.2020 02:01

@EduardoHerrera, в чем ошибка?

Daniele D. 25.10.2020 13:24
 console.info(/^(0|[1-9][0-9]*)$/.test(3000)) // true

Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, улучшает его долгосрочную ценность. Как ответить

Elletlar 12.11.2020 13:14

Другие вопросы по теме