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


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.