Я вообще не использовал регулярные выражения, поэтому у меня проблемы с устранением неполадок. Я хочу, чтобы регулярное выражение совпадало только тогда, когда содержащаяся строка - это все числа; но в двух приведенных ниже примерах он соответствует строке, содержащей все числа плюс знак равенства, например «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.
Try.Parse примет знак плюс или минус в начале и ведущие / конечные пробелы.
Вам нужно сопоставить числа или цифры? Например: 123,456 - это число, но это не все цифры.
Точно, OP не совсем понимает, использовать целые числа или нет
Взгляните на этот ответ, чтобы получить исчерпывающую информацию о синтаксическом анализе чисел с помощью регулярных выражений.
В общем, самый простой способ устранения проблем с выражениями Regex, на мой взгляд, - это использование интерпретатора командной строки, если ваш язык позволяет это (кажется, что большинство из них). Поскольку этот пример написан на C#, вы можете использовать linqpad.net или использовать точку останова в отладчике, а затем использовать окно Immediate в VS в качестве интерфейса командной строки.





Используйте начало и конец якоря.
Regex regex = new Regex(@"^\d$");
Используйте "^\d+$", если вам нужно сопоставить более одной цифры.
Обратите внимание, что "\d" будет соответствовать [0-9] и другим цифровым символам, таким как восточные арабские цифры ٠١٢٣٤٥٦٧٨٩. Используйте "^[0-9]+$", чтобы ограничить совпадения арабскими цифрами 0–9.
Если вам нужно включить какие-либо числовые представления, кроме цифр (например, десятичные значения для начинающих), см. подробное руководство по синтаксическому анализу чисел с помощью регулярных выражений@tchrist.
Как насчет установленного количества числовых значений? Обычно это так для почтовых индексов некоторых стран, например Индии. Думаю, после этого нам, возможно, придется проверить длину строки?
@Najeeb Да, поскольку индийский почтовый индекс представляет собой 6-значное число, вы можете использовать что-то вроде "^\d{6}$". В некоторых других странах для почтовых индексов действуют более сложные правила, поэтому решения с регулярными выражениями для нескольких стран тоже могут быть довольно сложными. Посмотрите некоторые примеры на stackoverflow.com/q/578406/1288
Почему, если строка ввода выглядит примерно так: «3 a», она все равно будет соответствовать? Кто-нибудь знает, как я могу заставить его соответствовать ТОЛЬКО если есть числа и ничего больше (кроме отрицательного знака, я полагаю). В настоящее время я настроил его так: "-? [0-9] +".
Это совпадение, потому что обнаруживается «совпадение», а не совпадение с полной строкой. Вы можете исправить это, изменив свое регулярное выражение, чтобы искать начало и конец строки.
^\d+$
Ваше регулярное выражение будет соответствовать всему, что содержит число, вы хотите использовать якоря, чтобы сопоставить всю строку, а затем сопоставить одно или несколько чисел:
regex = new Regex("^[0-9]+$");
^ закрепит начало строки, $ закрепит конец строки, а + будет соответствовать одному или нескольким из того, что ему предшествует (число в данном случае).
^ \ d + $, что означает «начало строки», «1 или более цифр», «конец строки» на английском языке.
Если вы хотите извлечь из строки только числа, вам может помочь шаблон «\ d +».
Если вам нужно терпеть десятичную точку и тысячный маркер
var regex = new Regex(@"^-?[0-9][0-9,\.]+$");
Вам понадобится «-», если число может стать отрицательным.
@ Флорин Гита. Спасибо. «-» должно быть в начале.
Это регулярное выражение также ошибочно допускает появление первого отрицательного знака (-) и точки (.) более одного раза.
вы можете сделать - и . необязательными через ?. -?\d+(?:\.\d+)? соответствует целым или десятичным числам. (?: в скобках просто делает их не захватывающей группой и используется только для группировки для ясности.)
Он не работает для крайних случаев, таких как 1, .5, но если вы это наблюдаете. все же он не работает для основных случаев, таких как -2. Пожалуйста, измените его на ^-?[0-9][0-9,\.]*$, чтобы избежать сбоев в базовом случае. + заменяется на *
Один сценарий, который мне здесь не хватает, - это инженерная нотация (1.2345e-4). Любое предложение по этому поводу?
не соответствует "0"
Другой способ: если вы хотите сопоставить международные номера, такие как персидский или арабский, вы можете использовать следующее выражение:
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?.
См. Символы Юникода в категории "Число, десятичная цифра".
Это работает с целыми и десятичными числами. Не совпадает, если число имеет разделитель тысяч запятую,
"^-?\\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] $")
Не могли бы вы немного пояснить свой ответ? Вы заметите, что в других ответах на этот вопрос есть некоторый уровень объяснения того, что делает каждая часть регулярного выражения, чего вам не хватает.
Вот мой рабочий:
^(-?[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) упомянутых вами языков распознают и правильно их преобразуют. благодаря.
@Ruslan вы правы, что во многих системах ".3", "3." будет анализировать действительное число и использовать, как вы упомянули, «0,3» и «3,0». Но с другой стороны - это значение преобразованный, поэтому значение оригинал ".3" и "3". на самом деле не существует числа.
Регулярное выражение для целых чисел и чисел с плавающей запятой:
^[+-]?\d*\.\d+$|^[+-]?\d+(\.\d*)?$
Число может начинаться с точки (без начальных цифр), и число может заканчиваться точкой (без конечных цифр). Выше регулярное выражение распознает оба как правильные числа.
А. (точка) без цифр не является правильным числом. Вот почему нам нужны две части регулярного выражения (разделенные знаком "|").
Надеюсь это поможет.
Это наиболее полное решение. Поздравляю!
Используйте начало и конец якоря.
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»
Вы можете дать мне более подробную информацию, потому что это раскрывает ошибку
я поставил textbox_changed
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; }
@EduardoHerrera, в чем ошибка?
console.info(/^(0|[1-9][0-9]*)$/.test(3000)) // true
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, улучшает его долгосрочную ценность. Как ответить
Почему бы не попробовать TryParse в этом простом случае? bool decimal.TryParse (строковая строка, результат из десятичного числа) или bool int.TryParse (строка строка, результат out int)