Итак, у меня длинная строка цифр, но мне нужно убедиться, что у нее нет цифр, самый простой способ сделать это?C# как проверить, содержит ли длинная строка какие-либо буквы или нет?
ответ
Используйте регулярные выражения:
using System.Text.RegularExpressions;
string myString = "some long characters...";
if(Regex.IsMatch(myString, @"^\d+$", RegexOptions.Compiled))
{
// String contains only numbers
}
if(Regex.IsMatch(myString, @"^\w+$", RegexOptions.Compiled))
{
// String contains only letters
}
Я не думаю, что ваше регулярное выражение делает то, что необходимо .. оно должно быть как минимум '' \\ d "' или '@" \ d "', но еще лучше должно быть как в этом ответе http: // stackoverflow.com/a/273144/863564, или он будет соответствовать любой строке, в которой есть цифра. –
В то время вопрос ОП был очень расплывчатым, поэтому мой ответ соответствовал этому вопросу. Я немного исправился. – qJake
Вы можете использовать char.IsDigit
:
var containsOnlyDigits = "007".All(char.IsDigit); // true
Он упомянул, что строка очень длинная ... LINQ крайне неэффективен в таких вещах. – qJake
@SpikeX Я так не думаю .. это наверняка лучше, чем регулярное выражение, и лучше, чем пытаться его разобрать! –
@SpikeX Кроме того, он быстро сработает ... –
Попробуйте использовать TryParse
bool longStringisInt = Int64.TryParse(longString, out number);
Если строка (т.е. longString) не может быть преобразован в межд (т. е. имеет в нем буквы), то bool ложно, иначе это было бы правдой.
EDIT: Изменен Int64 для обеспечения более широкого охвата
Не очень надежный, это могло бы потерпеть неудачу для чего-либо выше 2147483647. Если бы вы использовали этот подход, было бы лучше использовать 'Int64.TryParse'. – James
@James - правда, но предположительно (возможно, ошибочно) мы имеем дело с меньшими числами. Отредактированный ответ, чтобы включить ваше предложение. –
Сканирование строки, проверить полукокс ... s.All(c => Char.IsDigit(c))
Enumerable.All выйдет, как только он находит нецифры characted. IsDigit очень быстро проверяет символ. Стоимость - O (N) (насколько это возможно); Конечно, это bettet, чем попытка проанализировать строку (которая не удастся, если строка действительно длинная) или использовать regexpr ...
Если вы попробуете это решение и увидите, что это слишком медленно для вас, вы можете всегда вернуться к старым добрым петлями для сканирования строки ..
foreach (char c in s) {
if (!Char.IsDigit(c))
return false;
}
return true;
или даже лучше:
for (int i = 0; i < s.Length; i++){
if (!Char.IsDigit(s[i]))
return false;
}
return true;
EDIT: эталоны, наконец!
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text.RegularExpressions;
namespace FindTest
{
class Program
{
const int Iterations = 1000;
static string TestData;
static Regex regex;
static bool ValidResult = false;
static void Test(Func<string, bool> function)
{
Console.Write("{0}... ", function.Method.Name);
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < Iterations; i++)
{
bool result = function(TestData);
if (result != ValidResult)
{
throw new Exception("Bad result: " + result);
}
}
sw.Stop();
Console.WriteLine(" {0}ms", sw.ElapsedMilliseconds);
GC.Collect();
}
static void InitializeTestDataEnd(int length)
{
TestData = new string(Enumerable.Repeat('1', length - 1).ToArray()) + "A";
}
static void InitializeTestDataStart(int length)
{
TestData = "A" + new string(Enumerable.Repeat('1', length - 1).ToArray());
}
static void InitializeTestDataMid(int length)
{
TestData = new string(Enumerable.Repeat('1', length/2).ToArray()) + "A" + new string(Enumerable.Repeat('1', length/2 - 1).ToArray());
}
static void InitializeTestDataPositive(int length)
{
TestData = new string(Enumerable.Repeat('1', length).ToArray());
}
static bool LinqScan(string s)
{
return s.All(Char.IsDigit);
}
static bool ForeachScan(string s)
{
foreach (char c in s)
{
if (!Char.IsDigit(c))
return false;
}
return true;
}
static bool ForScan(string s)
{
for (int i = 0; i < s.Length; i++)
{
if (!Char.IsDigit(s[i]))
return false;
}
return true;
}
static bool Regexp(string s)
{
// String contains numbers
return regex.IsMatch(s);
// String contains letters
//return Regex.IsMatch(s, "\\w", RegexOptions.Compiled);
}
static void Main(string[] args)
{
regex = new Regex(@"^\d+$", RegexOptions.Compiled);
Console.WriteLine("Positive (all digitis)");
InitializeTestDataPositive(100000);
ValidResult = true;
Test(LinqScan);
Test(ForeachScan);
Test(ForScan);
Test(Regexp);
Console.WriteLine("Negative (char at beginning)");
InitializeTestDataStart(100000);
ValidResult = false;
Test(LinqScan);
Test(ForeachScan);
Test(ForScan);
Test(Regexp);
Console.WriteLine("Negative (char at end)");
InitializeTestDataEnd(100000);
ValidResult = false;
Test(LinqScan);
Test(ForeachScan);
Test(ForScan);
Test(Regexp);
Console.WriteLine("Negative (char in middle)");
InitializeTestDataMid(100000);
ValidResult = false;
Test(LinqScan);
Test(ForeachScan);
Test(ForScan);
Test(Regexp);
Console.WriteLine("Done");
}
}
}
Я дали положительный результат, и три негативы, 1) испытание, которое регулярное выражение является правильным, 2) ищет подтверждения подозреваемого у меня был ...
Мое мнение, что Regexp.IsMatch
пришлось сканировать строку, а также, и поэтому кажется: Времена согласуются с сканирований, только 3x хуже:
Positive (all digitis)
LinqScan... 952ms
ForeachScan... 1043ms
ForScan... 869ms
Regexp... 3074ms
Negative (char at beginning)
LinqScan... 0ms
ForeachScan... 0ms
ForScan... 0ms
Regexp... 0ms
Negative (char at end)
LinqScan... 921ms
ForeachScan... 958ms
ForScan... 867ms
Regexp... 3986ms
Negative (char in middle)
LinqScan... 455ms
ForeachScan... 476ms
ForScan... 430ms
Regexp... 1982ms
Кредиты: Я заимствовал функцию тестирования от Jon тарелочкам
Выводы: s.All(Char.IsDigit)
эффективен и очень прост (в конце концов, это был оригинальный вопрос). Лично я считаю, что это проще, чем регулярные выражения (мне приходилось смотреть на SO, который был правильным, поскольку я не знаком с синтаксисом C# regexp, который является стандартным, но я не знал - и предлагаемое решение было неправильным) , Итак, измеряйте и не верьте в мифы, подобные «LINQ is slow» или «RegExp медленны». В конце концов, они оба подходят для задачи (это действительно зависит от того, что вам нужно для этого), выберите тот, который вы предпочитаете.
Вы, вероятно, имели в виду Char.IsDigit (c). Однако это самое быстрое решение для всех. – Candide
@Candide ops, я забыл, что Char был статичным. Спасибо! Я отредактирую свой ответ –
Последняя попытка: я заменил 'Char.IsDigit' на' (c < '0' || c > '9') '; это не имеет значения (IsDigit так же хорош, как и он) –
Вы можете использовать IndexOfAny
bool containsDigits = mystring.IndexOfAny("".ToCharArray()) != -1;
В Linq вы бы сделать:
bool containsDigits = mystring.Any(char.IsDigit);
Edit:
Я приуроченная это и получается решение Linq является медленнее.
Для длины строки 1,000,000 время выполнения составляет ~ 13 мс для решения linq и 1 мс для IndexOfAny
.
Для длины строки 10 000 000 время выполнения для Linq все еще ~ 122 мс, тогда как IndexOfAny
составляет ~ 18 мс.
Отличное решение! Хотелось бы увидеть, как он сравнивается с проверкой строки и использует «IsDigit», производительность wise .. –
спасибо за бенчмарк! Я ожидаю, что цикл for() будет немного быстрее, но LINQ совсем не плох. :) –
@ dema80 Я стою исправлен. Я тестировал linq-решение с помощью 'All', и это неверно. Чтобы проверить, есть ли номер, вы должны использовать 'Any', как указано выше. Итак, да, linq медленнее. – Candide
- 1. Как проверить, содержит ли строка Perl буквы?
- 2. Как проверить, содержит ли строка только буквы?
- 3. проверить, содержит ли строка команду или нет?
- 4. как проверить, имеет ли строка английские буквы или нет
- 5. Как проверить, содержит ли строка буквы или буквы и апостроф, но нет чисел?
- 6. Как проверить, содержит ли строка только прописные или строчные буквы?
- 7. Как проверить, содержит ли строка только цифры или буквы? Android
- 8. Как проверить, содержит ли строка что-то или нет?
- 9. Как проверить, содержит ли строка только буквы в Python?
- 10. Строка содержит буквы
- 11. Как проверить, содержит ли строка все буквы алфавита?
- 12. Проверьте, содержит ли строка ведущие буквы
- 13. Проверка, содержит ли строка буквы
- 14. Как проверить, зашифрована ли строка или нет?
- 15. Как проверить, содержит ли строка только английские буквы?
- 16. Как проверить, содержит ли строка только буквы в PHP?
- 17. Как проверить, содержит ли строка ВСЕ буквы алфавита в python?
- 18. PHP - Как проверить, содержит ли строка только строчные буквы?
- 19. Как проверить, содержит ли строка какие-либо буквы из алфавита?
- 20. Строка только содержит буквы
- 21. JavaScript: проверить, если давая строка содержит только буквы или цифры
- 22. Проверить, содержит ли список элементы или нет
- 23. Как проверить, содержит ли строка '?' используя javascript
- 24. проверить, содержит ли строка строку
- 25. Как проверить, содержит ли строка специальные символы?
- 26. Как проверить, что NSString содержит «%» или нет?
- 27. Как проверить, содержит ли строка символы чисел
- 28. Как определить, содержит ли строка число или цифру или буквы в C#?
- 29. Как проверить, содержит ли строка письмо?
- 30. Обнаружение того, содержит ли строка не буквы
Регулярные выражения. – timmy
* Скомпилированные регулярные выражения. – qJake
Вам нужно начинать быть последовательным - ищете ли вы буквы или цифры? Ваше название и тело отличаются. Кроме того, если у вас есть «длинная строка цифр», но вам «нужно убедиться, что она не имеет никаких цифр», которая звучит как проблема. Внимание к деталям важно при задании вопроса. –