Как я могу проверить строку, чтобы в ней были разрешены только буквенно-цифровые символы? - PullRequest
105 голосов
/ 26 июня 2009

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

(я тоже не хочу использовать пробелы).

Ответы [ 8 ]

187 голосов
/ 20 мая 2013

В .NET 4.0 вы можете использовать LINQ:

if (yourText.All(char.IsLetterOrDigit))
{
    //just letters and digits.
}

yourText.All прекратит выполнение и вернет false в первый раз char.IsLetterOrDigit сообщает false, поскольку тогда контракт All не может быть выполнен

Примечание! в этом ответе не проверяются буквенно-цифровые символы (обычно это A-Z, a-z и 0-9). Этот ответ позволяет использовать локальные символы, такие как åäö.

Обновление 2018-01-29

Синтаксис выше работает только тогда, когда вы используете единственный метод, который имеет один аргумент правильного типа (в данном случае char).

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

if (yourText.All(x => char.IsLetterOrDigit(x) || char.IsWhiteSpace(x)))
{
}
167 голосов
/ 26 июня 2009

Используйте следующее выражение:

^[a-zA-Z0-9]*$

есть:

using System.Text.RegularExpressions;

Regex r = new Regex("^[a-zA-Z0-9]*$");
if (r.IsMatch(SomeString)) {
  ...
}
33 голосов
/ 26 июня 2009

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

public static bool IsAlphaNum(this string str)
{
    if (string.IsNullOrEmpty(str))
        return false;

    for (int i = 0; i < str.Length; i++)
    {
        if (!(char.IsLetter(str[i])) && (!(char.IsNumber(str[i]))))
            return false;
    }

    return true;
}

За комментарий :) ...

public static bool IsAlphaNum(this string str)
{
    if (string.IsNullOrEmpty(str))
        return false;

    return (str.ToCharArray().All(c => Char.IsLetter(c) || Char.IsNumber(c)));
}
17 голосов
/ 26 июня 2009

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

public class AlphaNumericString
{
    public AlphaNumericString(string s)
    {
        Regex r = new Regex("^[a-zA-Z0-9]*$");
        if (r.IsMatch(s))
        {
            value = s;                
        }
        else
        {
            throw new ArgumentException("Only alphanumeric characters may be used");
        }
    }

    private string value;
    static public implicit operator string(AlphaNumericString s)
    {
        return s.value;
    }
}

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

Если хотите, вы можете сделать все возможное и реализовать все операторы равенства или явное приведение к AlphaNumericString из простой старой строки.

8 голосов
/ 10 июня 2014

Мне нужно было проверить A-Z, a-z, 0-9; без регулярных выражений (хотя OP запрашивает регулярное выражение).

Смешивание различных ответов и комментариев здесь, а также обсуждение из https://stackoverflow.com/a/9975693/292060, - это проверка на букву или цифру, исключение букв других языков и избегание других цифр, таких как символы дроби.

if (!String.IsNullOrEmpty(testString)
    && testString.All(c => Char.IsLetterOrDigit(c) && (c < 128)))
{
    // Alphanumeric.
}
3 голосов
/ 25 февраля 2016

Чтобы проверить, является ли строка комбинацией букв и цифр, вы можете переписать @jgauffin ответ следующим образом, используя .NET 4.0 и LINQ:

if(!string.IsNullOrWhiteSpace(yourText) && 
yourText.Any(char.IsLetter) && yourText.Any(char.IsDigit))
{
   // do something here
}
3 голосов
/ 26 июня 2009

^\w+$ позволит a-zA-Z0-9_

Используйте ^[a-zA-Z0-9]+$, чтобы запретить подчеркивание.

Обратите внимание, что оба они требуют, чтобы строка не была пустой. Использование * вместо + допускает пустые строки.

0 голосов
/ 06 мая 2016

Советую не зависеть от готового и встроенного кода в .NET Framework, попробуйте найти новое решение .. это то, что я делаю ..

public  bool isAlphaNumeric(string N)
{
    bool YesNumeric = false;
    bool YesAlpha = false;
    bool BothStatus = false;


    for (int i = 0; i < N.Length; i++)
    {
        if (char.IsLetter(N[i]) )
            YesAlpha=true;

        if (char.IsNumber(N[i]))
            YesNumeric = true;
    }

    if (YesAlpha==true && YesNumeric==true)
    {
        BothStatus = true;
    }
    else
    {
        BothStatus = false;
    }
    return BothStatus;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...