2016-11-16 7 views
-1

Я хочу, чтобы определить, содержит ли строка число, либо записано в виде цифры (0-9), либо как буквы на простом английском (один, два, три ...). Буквенные числа в строке должны быть определены как отдельные слова, а не части слов.Как определить, содержит ли строка число или цифру или буквы в C#?

Так, например:

"This string contains no numbers" = false; 
"This string contains the number 1" = true; 
"This string contains the number three" = true; 
"This string contains a dogs bone" = false; //contains the word 'one' as part of the word 'bone', therefore returns false 

Не удалось найти что-нибудь на SO что конкретно отвечает на этот вопрос; они в основном связаны с извлечением целых чисел из строк, поэтому я подумал, что буду идти дальше и спрашивать.

Есть ли библиотека, которая может обрабатывать такие вещи? Если нет, то как я могу подойти к этому? Есть ли более быстрый способ, чем положить все словарные числа в массив?

+2

Я не вниз проголосовать , но в соответствии с «Как я могу задать хороший вопрос?» http://stackoverflow.com/help/how-to-ask article, вы не показали, что вы уже исследовали и/или попробовали. – AndyJ

ответ

4

Если просто вы имеете в виду использование встроенной библиотеки, то я не знаю об этом, я буду с радостью исправил, если кто-то знает лучше.

Edit: обновлены с OPS разъяснения и рекомендации AndyJ «s

Чтобы сделать это на отдельные слова, которые вы можете использовать этот метод вместо:

public bool ContainsNumber(string s) 
{ 
    // This is the 'filter' of things you want to check for 
    // The '...' is for brevity, obviously it should have the other numbers here 
    var numbers = new List<string>() { "1", "2", "3", ... , "one", "two", "three" }; 

    // Split the provided string into words 
    var words = s.Split(' ').ToList(); 

    // Checks if the list of words matches ANY of the provided numbers 
    // Case and culture insensitive for better matching 
    return words.Any(w => numbers.Any(n => n.Equals(w, StringComparison.OrdinalIgnoreCase))); 
} 

Использование:

ContainsNumber («Нет номеров здесь»);
Содержит номер («Число три»);
Содержит номер («Собака съела кость»);

Выходные:

ложные
истинные
ложные

Edit 2: Для того, чтобы вернуть соответствующие слова

public List<string> GetMatches(string s) 
{ 
    var numbers = new List<string>() { "1", "2", "3", ... , "one", "two", "three" }; 
    var words = s.Split(' ').ToList(); 

    return words.Intersect(numbers, StringComparer.OrdinalIgnoreCase).ToList(); 
} 

Us возраст:

GetMatches («у этого нет номеров»);
GetMatches («у этого есть одно число»);
GetMatches («у этого 1 есть кость»);
GetMatches («1 два 3, а затем еще несколько»);

Выход:

нуль
"один"
"1"
"1", "два", "3"

+0

Ну да, это вернет истину для предложения, но это правильно. Строка ** содержит ** номер. – Poody

+1

Непонятно, что OP хотел так подумать, я бы упомянул об этом конкретном случае. – Equalsk

+0

@Poody ... Говорят как настоящий программист;) хотя я подозреваю, что OP означает «как отдельные слова». – AndyJ

0

создать массив со всем, что вы хотите посмотреть в этой строке, и повторить его.

его голодное решение, если вы только заботитесь о одиночных цифрах. если вы хотите сделать это со всеми типами чисел, это потребует еще нескольких работ .....

+0

Не совсем простой способ сделать это. – Poody

+1

это около 4-5 строк кода. это больше для домашней цели, а не от развития реальной жизни. вы можете сделать массив для строк и запустить цикл for для чисел ... но это та же идея. – Dani

+0

@ Equalsk просто реализует эту идею. 5 строк :-) – Dani