문자열에 영숫자 만 허용하도록 문자열의 유효성을 검사하려면 어떻게해야합니까?


117

영숫자 문자 만 허용하도록 정규식을 사용하여 문자열의 유효성을 검사하려면 어떻게해야합니까?

(나는 어떤 공백도 허용하고 싶지 않습니다).

답변:


181

다음 표현식을 사용하십시오.

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

즉 :

using System.Text.RegularExpressions;

Regex r = new Regex("^[a-zA-Z0-9]*$");
if (r.IsMatch(SomeString)) {
  ...
}

내가 생각하는 것과 같은 자바 스크립트는 어떻습니까?
— mrblah

4
데이터베이스 이름이나 이와 같은 내부를 삭제하면 영어권 국가에서 실행되지 않더라도 상관하지 않을 것입니다.
— Ognyan Dimitrov

15
나는 정규식을 싫어한다. 나는 구문을 결코 기억하지 못할 것임을 압니다. 공부를해도 곧 다시 잊혀지는 때가 올 것이다.
— Sentinel

1
@ 필. 하지만 그때
— Sentinel

3
"정규 표현식을 사용하여 문제를 해결하면 두 가지 문제가 있습니다."라고합니다.
— O. Jones

205

.NET 4.0에서는 LINQ를 사용할 수 있습니다.

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

yourText.All계약을 이행 할 수 없기 때문에 실행을 중지 false하고 처음 char.IsLetterOrDigit보고서를 반환 합니다 .falseAll

노트! 이 답변은 영숫자 (일반적으로 AZ, az 및 0-9)를 엄격하게 확인하지 않습니다. 이 답변은 åäö.

업데이트 2018-01-29

위의 구문은 올바른 유형 (이 경우 char) 의 단일 인수가있는 단일 메서드를 사용할 때만 작동합니다 .

여러 조건을 사용하려면 다음과 같이 작성해야합니다.

if (yourText.All(x => char.IsLetterOrDigit(x) || char.IsWhiteSpace(x)))
{
}

1
그렇게 빠르지 않으면 놀랄 것입니다. 컴파일하거나 평가할 정규식이 없으며 단순한 비교 일뿐입니다.
— jgauffin 2014

3
이제 그것은 아름답고 단순하며 단순합니다.
— Sentinel

3
yourText가 확실히 영숫자인지 확인하려면 실패하지 않습니까? 모든 숫자 또는 모든 알파벳 일 수 있지만 여전히이 조건을 충족합니다.
— itsbalur 2015

2
@itsbalur : 예,하지만 그것은 질문이 아닙니다.
— jgauffin

2
영숫자 세트가 AZ, az 및 0-9라고 가정하면이 대답은 비 라틴 문자도 포함하여 유니 코드 문자와 숫자의 전체 범위를 포함하기 때문에 잘못되었다고 생각합니다. 예를 들어 char.IsLetterOrDigit('ก')는를 반환 true합니다. csharppad.com/gist/f96a6062f9f8f4e974f222ce313df8ca
— TIA

34

정규식이 아닌 확장 기능으로 쉽게 할 수 있습니다 ...

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)));
}

2
맛의 문제 일 수 있지만 루프를 "foreach (char c in str) {...}"로 표현합니다. 빈 문자열을 OK로 간주할지 여부는 응용 프로그램에 따라 다르므로 이것을 제거합니다. 나는 또한 그런 사소한 루틴에 6 개의 빈 줄을 채우지 않을 것이지만 그것이 C # / Java / C ++ 스타일이라고 생각합니다. 코더는 화면 공간에 의해 지불되는 것 같습니다. 어쨌든 이것은 올바른 방향이므로 +1.
— Svante

3
나는 우리가 오히려 ISNUMBER보다,이 상황에서 isdigit에 사용하려는 거라고 생각 것 - ISNUMBER 그 자리에, 또는 일에 대해 true를 반환합니다 보기 ; 번호 (분수, 로마 숫자, 등 같은 참조 msdn.microsoft.com/을 en-us / library / yk2b3t2y.aspx ). 이를 감안할 때 특히 악하다고 느끼면 IsAlphaNum의 내용을 더 압축 할 수 있습니다. return string.IsNullOrEmpty (str)? false : str.ToCharArray (). All (Char.IsLetterOrDigit);
— 스택

4
Char.IsLetter는 a-zA-Z 이외의 "문자"에 대해 true로 평가됩니다. 예를 들어, 일본어 あ, 중국어 的, 한국어 한 등은 유니 코드 "문자"로 간주됩니다. 이것이 당신의 의도라면 괜찮지 만 다른 답변의 다양한 정규식 표현으로 판단하면 이것은 대부분의 영숫자라고 간주되는 것이 아닙니다.
— Dono 2014

제 경우에는 IsLetter와 IsNumber 외에 IsWhiteSpace도 필요했기 때문에 코드에 추가했고 완벽하게 작동했습니다!
— Ben Junior

사용하는 char.IsLetterOrDigit대신에 대해서 isLetterOrDigit + ISNUMBER
— nick_n_a

17

정규식 기반 솔루션이 아마도 내가 가고 싶은 방식이라고 생각하지만 이것을 유형으로 캡슐화하고 싶을 것입니다.

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이 필요하도록 할 수 있으며, 하나를 가져 오면 유효하다는 것을 알 수 있습니다 (null 제외). 누군가 검증되지 않은 문자열을 전달하려고하면 컴파일러 오류가 발생합니다.

당신은 더 좋아하고 모든 등식 연산자를 구현하거나 관심이 있다면 일반 ol '문자열에서 AlphaNumericString에 대한 명시 적 캐스트를 구현할 수 있습니다.


저는이 접근 방식을 본 적이 없지만 의도의 명확성과 정당성을 좋아합니다. +1.
— Cory House

1
이것은 나에게 새로운 것입니다. static public implicit operator string부분 을 이해하려고 해요
— Hassan Gulzar

8

AZ, az, 0-9를 확인해야했습니다. 정규식없이 (OP가 정규식을 요구하더라도).

여기에서 다양한 답변과 의견을 혼합하고 https://stackoverflow.com/a/9975693/292060의 토론을 결합 하여 문자 또는 숫자를 테스트하고 다른 언어 문자를 피하고 분수 문자와 같은 다른 숫자를 피합니다.

if (!String.IsNullOrEmpty(testString)
    && testString.All(c => Char.IsLetterOrDigit(c) && (c < 128)))
{
    // Alphanumeric.
}

4

^\w+$ 허용 할 것이다 a-zA-Z0-9_

^[a-zA-Z0-9]+$밑줄을 허용하지 않으려면 사용 합니다.

이 두 가지 모두 문자열이 비어 있지 않아야합니다. *대신 사용 +하면 빈 문자열 이 허용됩니다.


"-"대시 문자를 허용하도록 ^ \ w + $를 어떻게 변경할 수 있습니까?
— Neal Davis

@NealDavis^[\w-]+$
— Zachafer

2

문자열이 문자와 숫자의 조합인지 확인하려면 .NET 4.0 및 LINQ를 사용하여 다음과 같이 @jgauffin 응답을 다시 작성할 수 있습니다.

if(!string.IsNullOrWhiteSpace(yourText) && 
yourText.Any(char.IsLetter) && yourText.Any(char.IsDigit))
{
   // do something here
}

이것은 잘못 ... 숫자와 함께 다른 문자가 포함 된 문자열을 인식
— nsimeonov

1

여기 와 같은 대답 입니다.

정규식이 아닌 ASCII A-z 0-9검사 를 원하면 char.IsLetterOrDigit()다른 유니 코드 문자를 포함하므로 사용할 수 없습니다 .

할 수있는 일은 문자 코드 범위를 확인하는 것입니다.

  • 48-> 57은 숫자입니다.
  • 65-> 90은 대문자입니다.
  • 97-> 122는 소문자입니다.

다음은 좀 더 장황하지만 코드 골프보다는 이해하기 쉽기위한 것입니다.

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

        for (int i = 0; i < str.Length; i++)
        {
            if (str[i] < 48) // Numeric are 48 -> 57
            {
                return false;
            }

            if (str[i] > 57 && str[i] < 65) // Capitals are 65 -> 90
            {
                return false;
            }

            if (str[i] > 90 && str[i] < 97) // Lowers are 97 -> 122
            {
                return false;
            }

            if (str[i] > 122)
            {
                return false;
            }
        }

        return true;
    }

0

cletus의 답변에 따라 새 확장을 만들 수 있습니다.

public static class StringExtensions
{        
    public static bool IsAlphaNumeric(this string str)
    {
        if (string.IsNullOrEmpty(str))
            return false;

        Regex r = new Regex("^[a-zA-Z0-9]*$");
        return r.IsMatch(str);
    }
}

-8

.NET 프레임 워크의 준비된 코드에 의존하지 말고 새로운 솔루션을 가져 오십시오. 이것이 내가하는 일입니다.

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;
}

2
코드에 약간의 설명을 추가해 주시겠습니까? 그냥 덤핑 코드는 일반적으로 여기에서 눈살을 찌푸
— 립니다

또한 그들은 정규식을 요청했습니다. 이것은 정규식이 아닙니다
— Draken

의견과 관찰에 감사드립니다. 내가 코드를 작성하는 방법이 있다고 조언했듯이.
— Mahdi Al Aradi 2016 년

5
.Net의 사전 빌드 코드에 의존하지 않는 것에 대한 귀하의 의견은 거의 의미가 없습니다. 확실히 사전 빌드 코드에 의존해서는 안된다면 미리 빌드 된 코드이므로이 char.IsNumber()메서드를 사용해서는 안됩니다 .
— Draken

4
이 코드는 자신을 재창조하는 것이 왜 그렇게 나쁜 생각인지에 대한 훌륭한 예입니다. 실제로 원하는 작업을 수행하지 않습니다! (문자열 "@ 1a"는 true를 잘못 반환하고 "a"는 false를 반환합니다.)
— Flexo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.