영숫자 및 밑줄에 대한 정규식


585

문자열에 대문자, 소문자, 숫자 및 밑줄 만 포함되어 있는지 확인하는 정규식을 갖고 싶습니다.

regex 

9
다른 정규식 엔진이 영숫자를 일치시키는 다른 수단을 갖는 것은 유감입니다. 이와 같은 질문 (언어 / 정규 풍미가 표시되지 않은 모호한)은 각 풍미에 매우 길거나 최소한 매우 체계적인 답변이 필요합니다.
Wiktor Stribiżew

답변:


938

해당 문자 포함 된 문자열 (또는 빈 문자열) 을 일치 시키려면

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

이것은 .NET 정규 표현식 및 다른 많은 언어에서도 작동합니다.

세분화 :

^ : start of string
[ : beginning of character group
a-z : any lowercase letter
A-Z : any uppercase letter
0-9 : any digit
_ : underscore
] : end of character group
* : zero or more of the given characters
$ : end of string

빈 문자열을 허용하지 않으려면 * 대신 +를 사용하십시오.


다른 사람들이 지적했듯이 일부 정규 표현식 언어는의 약어입니다 [a-zA-Z0-9_]. .NET 정규식 언어에서 ECMAScript 동작을 켜고 \w속기 (수확 ^\w*$또는 ^\w+$)로 사용할 수 있습니다. 다른 언어 및 기본적으로 .NET에서는 \w다소 광범위하며 다른 종류의 유니 코드 문자와도 일치합니다 (이 점을 지적한 Jan 덕분). 따라서 해당 문자 일치 시키려면 명시 적 (더 긴) 형식을 사용하는 것이 가장 좋습니다.


8
독일에 가거나 독일어 텍스트 만 보이면 내가 말하는 것을 볼 수 있습니다.
Windows 프로그래머

30
\ w와 [A-Za-z0-9_]는 대부분의 정규 표현식에서 동일하지 않습니다. \ w는 분음 부호가있는 문자, 다른 스크립트의 문자 등을 포함합니다.
Jan Goyvaerts

4
원래 질문에 "대문자와 소문자"가 표시되었으므로 라틴 이외의 스크립트의 "문자"가 일치해야합니다.
Trejkaz

3
[\p{upper}\p{lower}\p{gc=Number}_]결합 문자가 없다고 가정하면이 작업을 올바르게 수행해야합니다.
tchrist

1
preg_match를 사용하려면 패턴을 구분 기호로 묶어야합니다. 일반적으로 슬래시입니다. 따라서 "/ ^ [a-zA-Z0-9 _] * $ /"가 필요합니다. 자세한 정보를 원하시면이 질문을 참조하십시오 stackoverflow.com/questions/6445133/...을 . 이 페이지도 참조하십시오 : forums.phpfreaks.com/topic/…
Charlie

346

여기에 많은 상세가 있으며, 나는 그것에 대해 깊이 반대하고 있으므로 내 결정적인 대답은 다음과 같습니다.

/^\w+$/

\w[A-Za-z0-9_]원하는 것과 거의 같습니다 . (믹스에 유니 코드를 도입하지 않는 한)

+수량자를 사용하면 하나 이상의 문자와 일치합니다. 빈 문자열도 허용하려면 *대신 사용하십시오.


67
\w일반적으로 ASCII만으로 제한되지 않습니다.
tchrist

26
영어는 세계에서 유일한 언어가 아니므로이 언어 [a-z]와 그 변형이 아닌 이것이 정답 입니다. \w비 라틴 문자도 캡처합니다. 마찬가지로 šēēāкукареку
알렉스

1
"정규 표현식 마스터"오라일리의 318 페이지의 검증 된
guidotex

36

각 캐릭터가 요구 사항과 일치하는지 확인하고 싶기 때문에 다음을 사용합니다.

[A-Za-z0-9_]

그리고 속기 버전을 사용할 수도 있습니다.

\w

어느 것이 동등한 지 (일부 정규식 풍미에서는 사용하기 전에 확인하십시오). 그런 다음 전체 문자열이 일치해야 함을 나타내려면 다음을 사용하십시오.

^

문자열이 해당 문자로 시작해야 함을 나타내려면

$

문자열을 나타내려면 해당 문자로 끝나야합니다. 그런 다음 사용

\w+ or \w*

"1 이상"또는 "0 이상"을 나타냅니다. 모든 것을 종합하면 다음과 같은 이점이 있습니다.

^\w*$

10
\ w와 [A-Za-z0-9_]는 대부분의 정규 표현식에서 동일하지 않습니다. \ w는 분음 부호가있는 문자, 다른 스크립트의 문자 등을 포함합니다.
Jan Goyvaerts

31

음 ... 질문 : 캐릭터가 하나 이상 있어야합니까? 빈 문자열 일 수 있습니까?

^[A-Za-z0-9_]+$

하나 이상의 대문자 또는 소문자 영숫자 또는 밑줄을 수행합니다. 길이가 0이 아닌 경우 +를 *로 대체하십시오.

^[A-Za-z0-9_]*$

편집하다:

분음 부호를 포함해야하는 경우 (예 : cedilla-ç) 위와 동일하지만 분음 부호 문자를 포함하는 단어 문자를 사용해야합니다.

^\w+$

또는

^\w*$

글쎄, 당신이 그것을 언급
했듯이

1
\ 적은 노력으로 타이핑 [w \]와 동일 승
월 Goyvaerts

그래, 당신은 여전히 ​​+ 또는 *가 필요하고 ^와 $-\ w는 단어 문자 포함 하지 않고 단어 문자 포함 되어 있는지 확인합니다 .
BenAlabaster

이상하게도 여전히 $ 기호를 사용할 수 있습니다.
Induster

@Induster, BenAlabaster가 방금 지적한 것 때문입니다
Sebas

27

보다 장황하지만 \wPOSIX 문자 클래스 이름 ( http://www.zytrax.com/tech/web/regex.htm#special ) 의 가독성을 개인적으로 높이 평가합니다 .

^[[:alnum:]_]+$

그러나 위 링크의 문서에는 \w"0-9, A-Z 및 a-z 범위의 모든 문자와 일치 (POSIX [: alnum :]과 동일)"라는 내용이 있지만, 이것이 사실이 아닙니다. . grep -P어쨌든 아닙니다 . 사용하는 경우 밑줄을 명시 적으로 포함해야 [:alnum:]하지만 사용하는 경우에는 포함 하지 않아야합니다 \w. 짧고 달콤한 것에 대해 다음을 이길 수 없습니다.

^\w+$

가독성과 함께 POSIX 문자 클래스 ( http://www.regular-expressions.info/posixbrackets.html )를 사용하면 정규 표현식이 ASCII가 아닌 문자열에서 작동 할 수 있으며, 범위 기반 정규 표현식은 의존하지 않으므로 범위 기반 정규 표현식이 작동하지 않습니다. ASCII 문자의 기본 순서는 다른 문자 집합과 다를 수 있으므로 캡처하려는 ASCII가 아닌 문자 (예 : –)를 제외합니다.


22

Computer Science에서 영숫자 값은 종종 첫 번째 문자가 숫자가 아니라 알파벳 또는 밑줄임을 의미합니다. 그 후, 문자가 될 수있다 0-9, A-Z, a-z, 또는 밑줄 ( _).

그 방법은 다음과 같습니다.

PHP에서 테스트 :

$regex = '/^[A-Za-z_][A-Za-z\d_]*$/'

또는 이것을 가지고

^[A-Za-z_][A-Za-z\d_]*$

개발 언어로 배치하십시오.


17

어때요?

^([A-Za-z]|[0-9]|_)+$

... 명시 적이거나 다음과 같은 경우 :

^\w+$

... 간결한 것을 선호하는 경우 (Perl 구문).


12

lookaheads를 사용하여 "적어도 하나"를 수행하십시오. 훨씬 쉬워요.

다음은 하나 이상의 숫자와 하나의 문자를 포함하는 1-10 개의 문자가 필요한 예입니다.

^(?=.*\d)(?=.*[A-Za-z])[A-Za-z0-9]{1,10}$

참고 : \ w를 사용할 수 있었지만 ECW / 유니 코드 고려 사항은 \ w "워드 문자"의 문자 범위를 증가시킵니다.


_와-를 목록에 추가하려면 어떻게해야합니까?
Rahi

10

문자열에 대해 만든 다국어 확장을 시도하십시오.

IsAlphaNumeric-문자열에는 적어도 1 개의 알파 (charSet에 지정된 유니 코드 범위의 문자)와 적어도 1 개의 숫자 (numSet에 지정된)가 포함되어야합니다. 또한 문자열은 알파와 숫자로만 구성되어야합니다.

IsAlpha-문자열은 최소한 1 개의 알파를 포함해야하며 (지정된 언어 charSet) 알파 만 포함해야합니다.

IsNumeric-문자열은 최소한 1 개의 숫자 (지정된 언어 numSet)를 포함해야하며 숫자로만 구성되어야합니다.

원하는 언어에 대한 charSet / numSet 범위를 지정할 수 있습니다. 유니 코드 범위는 아래 링크에서 제공됩니다.

http://www.ssec.wisc.edu/~tomw/java/unicode.html

API :

    public static bool IsAlphaNumeric(this string stringToTest)
    {
        //English
        const string charSet = "a-zA-Z";
        const string numSet = @"0-9";

        //Greek
        //const string charSet = @"\u0388-\u03EF";            
        //const string numSet = @"0-9";

        //Bengali
        //const string charSet = @"\u0985-\u09E3";
        //const string numSet = @"\u09E6-\u09EF";

        //Hindi
        //const string charSet = @"\u0905-\u0963";
        //const string numSet = @"\u0966-\u096F";

        return Regex.Match(stringToTest, @"^(?=[" + numSet + @"]*?[" + charSet + @"]+)(?=[" + charSet + @"]*?[" + numSet + @"]+)[" + charSet + numSet +@"]+$").Success;
    }

    public static bool IsNumeric(this string stringToTest)
    {
        //English
        const string numSet = @"0-9";

        //Hindi
        //const string numSet = @"\u0966-\u096F";

        return Regex.Match(stringToTest, @"^[" + numSet + @"]+$").Success;
    }

    public static bool IsAlpha(this string stringToTest)
    {
        //English
        const string charSet = "a-zA-Z";

        return Regex.Match(stringToTest, @"^[" + charSet + @"]+$").Success;
    }

사용법 :

        //English
        string test = "AASD121asf";

        //Greek
        //string test = "Ϡϛβ123";

        //Bengali
        //string test = "শর৩৮";

        //Hindi
        //string test = @"क़लम३७ख़";

        bool isAlphaNum = test.IsAlphaNumeric();

@ Shah : 나는 유일한 알파벳을 추가했습니다 (그리고 숫자 만).
Shantanu

8

다음 정규식은 영숫자 및 밑줄과 일치합니다.

^[a-zA-Z0-9_]+$

예를 들어, Perl에서 :

#!/usr/bin/perl -w

my $arg1 = $ARGV[0];

# check that the string contains *only* one or more alphanumeric chars or underscores
if ($arg1 !~ /^[a-zA-Z0-9_]+$/) {
  print "Failed.\n";
} else {
    print "Success.\n";
}

코드의 패턴은 정확하지만 위의 패턴은 단일 인스턴스 만 확인합니다.
BenAlabaster

의도적으로 코드 샘플은 실제로 문자열을 확인할 때 사용법을 명확히하기위한 것입니다. 또한 왜 코드에 정규 표현식 예제에없는 시작 및 끝 줄 표시가 있습니까?
Jay

1
@Windows 프로그래머 - en.wikipedia.org/wiki/Alphanumeric - 라틴어 알파벳 이 아닌 "라틴어 문자 집합"분음 부호 등 순수 의미의 문제를 포함하지만, 나는 개인적으로 AZ와 같은 용어 숫자의 일반적인 사용에 가서 무엇을 0-9.
Jay

2
ñ는 라틴 아메리카를 포함하여 스페인어로 된 알파벳 문자입니다.
Windows 프로그래머

2
"문자열에 대문자, 소문자, 숫자 및 밑줄 만 포함되어 있는지 확인하는 정규식을 갖고 싶습니다."는 라틴 문자로 제한하지 않습니다. "다음 정규식은 영숫자와 밑줄과 일치합니다."는 라틴 문자로 제한되지 않습니다. "^ [a-zA-Z0-9 _] + $"에 실패했습니다.
Windows 프로그래머

6

이것은 대부분의 경우에 효과가 있습니다.

/^[\d]*[a-z_][a-z\d_]*$/gi

그리고 가장 의미하는 바는

abcd       True
abcd12     True
ab12cd     True
12abcd     True

1234       False


설명

  1. ^ ... $ -시작하고 끝나는 패턴과 일치
  2. [\d]* -0 자리 이상 일치
  3. [a-z_] -알파벳이나 밑줄과 일치
  4. [a-z\d_]* -알파벳이나 숫자 또는 밑줄과 일치
  5. /gi -문자열 전체에서 대소 문자를 구분하지 않고 전역 적으로 일치

2
원래 질문에는 서신이 있어야한다는 요구 사항이 없었습니다.
Dmitry Kuzminov

당신은 어떤 편지에 대해 이야기하고 있습니까? 내 정규 표현식에 질문에 포함 된 정규 표현식이 포함되어 있습니다. 알파벳, 숫자, 밑줄
Chinmaya Pati

1234저자에 의해 요청 된 언어의 단어입니다. 당신의 언어는 더 제한적입니다.
Dmitry Kuzminov

4

나에게 알파, 숫자 및 알파벳 숫자를 구별하고 싶은 문제가있어서 영숫자 문자열에 적어도 하나의 알파와 적어도 하나의 숫자가 포함되도록하려면 다음을 사용했습니다.

^([a-zA-Z_]{1,}\d{1,})+|(\d{1,}[a-zA-Z_]{1,})+$

정확히 내가 원하는 ... 감사합니다
아니 켓 케일

3

다음은 수량자를 사용하여 1 자 이상 255 자 이하로 지정하려는 정규식입니다.

[^a-zA-Z0-9 _]{1,255}


2

나는 당신이 당신의 성냥에서 라틴어와 유니 코드 문자를 사용하지 않는다고 생각합니다. 예를 들어 "ã"또는 "ü"문자를 사용해야하는 경우 "\ w"를 사용할 수 없습니다.

또는이 방법을 사용할 수 있습니다.

^[A-ZÀ-Ýa-zà-ý0-9_]+$

그것이 도움이되기를 바랍니다!



1

^\w*$ 아래 조합에서 작동합니다

1
123
1av
pRo
av1

빈 줄은 어떻습니까? 영숫자 문자열입니까?
v010dya


0

이것은 나를 위해 작동합니다. 오라일리의 "정규 표현식 마스터 링"에서 이것을 발견했습니다.

/^\w+$/

설명:

  • ^ 문자열의 시작 위치를 주장
    • \ w +는 모든 단어 문자와 일치합니다 ([a-zA-Z0-9_]와 동일)
    • "+"수량 자 — 가능한 한 여러 번 일치하는 한 번과 무제한으로 일치 (욕심 많음)
  • $는 문자열의 끝에서 위치를 주장

자신을 확인하십시오 :

const regex = /^\w+$/;
const str = `nut_cracker_12`;
let m;

if ((m = regex.exec(str)) !== null) {
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.