英数字とアンダースコアの正規表現


585

文字列に大文字、小文字、数字、アンダースコアのみが含まれているかどうかをチェックする正規表現が欲しいのですが。

regex 

9
正規表現エンジンごとに英数字を照合する手段が異なるのは残念です。このような質問(曖昧で、言語や正規表現のフレーバーが示されていない)では、各フレーバーに非常に長い、または少なくとも非常に体系的な回答が必要です。
WiktorStribiżew2016年

回答:


939

それらの文字のみを含む文字列(または空の文字列)に一致させるには、

"^[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 regex言語では、ECMAScriptの動作をオンにし\wて、省略形(yielding ^\w*$または^\w+$)として使用できます。他の言語では、デフォルトでは.NETで\wやや広範であり、他の種類のUnicode文字にも一致することに注意してください(指摘してくれたJanに感謝します)。したがって、これらの文字のみを一致させるつもりなら、明示的な(長い)形式を使用するのがおそらく最善です。


8
ドイツに行ったり、ドイツ語のテキストを見たりした場合、私が言っていることがわかります。
Windowsプログラマ

30
\ wと[A-Za-z0-9_]は、ほとんどの正規表現フレーバーでは同等ではありません。\ wは、発音区別符号付きの文字、他のスクリプトからの文字などを含みます
Jan Goyvaerts

4
元の質問では「大文字と小文字」と書かれていたため、非ラテン文字の「文字」は一致しているように見えます。
Trejkaz、2011年

3
[\p{upper}\p{lower}\p{gc=Number}_]結合文字がないと仮定して、これを正しく行うために必要なすべてです。
tchrist

1
preg_matchでは、パターンを区切り文字(通常はスラッシュ)で囲む必要があるようです。したがって、「/ ^ [a-zA-Z0-9 _] * $ /」が必要になります。詳細については、この質問を参照してください:stackoverflow.com/questions/6445133/…。また、このページを参照してください。forums.phpfreaks.com/topic/...を
チャーリー・

346

ここには多くの冗長性があり、私はそれに強く反対しているので、私の決定的な答えは次のようになります:

/^\w+$/

\wはと同等[A-Za-z0-9_]です。(ユニコードをミックスに導入しない限り)

+数量詞を使用して、1つ以上の文字を照合します。空の文字列も受け入れたい場合は、*代わりに使用してください。


67
\w通常、ASCIIだけに制限されていません。
tchrist

26
英語は世界で唯一の言語ではないので、これは受け入れられる答えであり、[a-z]とそのバリエーションではありません。\w非ラテン文字もキャプチャします。同様šēēāкукареку
アレックス・

1
O'Reilly "Mastering Regular Expressions"の318ページで検証
guidotex

36

各文字が要件に一致していることを確認する必要があるため、以下を使用します。

[A-Za-z0-9_]

また、省略形のバージョンを使用することもできます。

\w

これは同等です(一部の正規表現では、使用する前に確認してください)。次に、文字列全体が一致する必要があることを示すには、次を使用します。

^

文字列がその文字で始まる必要があることを示すには、次を使用します

$

文字列がその文字で終わる必要があることを示します。次に使用します

\w+ or \w*

「1以上」または「0以上」を示します。すべてをまとめると、次のようになります。

^\w*$

10
\ wと[A-Za-z0-9_]は、ほとんどの正規表現フレーバーでは同等ではありません。\ wは、発音区別符号付きの文字、他のスクリプトからの文字などを含みます
Jan Goyvaerts

32

ええと…質問:少なくとも1人のキャラクターがいる必要があるのか​​、それともないのか?空の文字列にすることはできますか?

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

少なくとも1つの大文字または小文字の英数字またはアンダースコアを実行します。長さがゼロの場合は、*を+に置き換えます。

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

編集:

分音記号を含める必要がある場合(cedilla-çなど)、上記と同じように動作するが、分音記号文字を含む単語文字を使用する必要があります。

^\w+$

または

^\w*$

さて、あなたはそれについて言及しましたが、私は他のフランス語のキャラクターもたくさん見逃しました...
BenAlabaster 2008

1
\ wは[\ w]と同じですが、タイピングの労力が少ない
Jan Goyvaerts、2008

はい、まだ+または*が必要です。^と$-\ wは、単語文字のみが含まれているのはなく、単語文字が含まれていることを確認するだけです...
BenAlabaster

奇妙なことに、これはまだ$記号を許可します。
インダストリー

@Induster、それはBenAlabasterがちょうど指摘したことによるものです
Sebas

27

より詳細ですが\w、個人的には完全なPOSIX文字クラス名(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

コンピュータサイエンスでは、多くの場合、英数字の値は最初の文字が数字ではなくアルファベットまたはアンダースコアであることを意味します。その後の文字ができ0-9A-Za-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

先読みを使用して「少なくとも1つの」ことを行います。信じてください、それはずっと簡単です。

以下は、少なくとも1つの数字と1つの文字を含む、1〜10文字を必要とする例です。

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

注:\ wを使用することもできますが、ECMA / Unicodeの考慮事項が作用して、\ w "単語文字"の文字カバレッジが増加します。


リストに_と-を追加したい場合はどうしますか?
Rahi、

10

文字列用に作成したこれらの多言語拡張機能を試してください。

IsAlphaNumeric-文字列には、少なくとも1つのアルファ(Unicode範囲の文字、charSetで指定)および少なくとも1つの数値(numSetで指定)を含める必要があります。また、文字列は英字と数字のみで構成する必要があります。

IsAlpha-文字列には少なくとも1つのアルファ(指定された言語のcharSet)が含まれ、アルファのみで構成される必要があります。

IsNumeric-文字列には少なくとも1つの数値(指定された言語numSet)を含み、数値のみで構成する必要があります。

目的の言語のcharSet / numSet範囲を指定できます。Unicodeの範囲は、以下のリンクから入手できます。

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 2012

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 2008

これは意図的なものであり、コードサンプルは実際に文字列をチェックする際の明確な使用法を意図したものです。また、なぜ正規表現の例にはない行頭マーカーと行末マーカーもコードにあるのです。
ジェイ

1
@Windowsプログラマ- en.wikipedia.org/wiki/Alphanumeric -ラテンアルファベット、純粋な発音区別符号などを含んでいるものを意味論の問題ではない「ラテン文字セット」が、私は個人的にAZという用語は、英数字の一般的な使用法で行くと0-9。
ジェイ

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]* -ゼロ以上の数字に一致
  3. [a-z_] -アルファベットまたはアンダースコアに一致
  4. [a-z\d_]* -アルファベット、数字、またはアンダースコアに一致
  5. /gi -文字列全体でグローバルに一致し、大文字と小文字を区別しません

2
元の質問には、手紙を提出する必要はありませんでした。
Dmitry Kuzminov

あなたはどの手紙について話しているのですか?私の正規表現には、質問で尋ねられたものが含まれています。アルファベット、数字、下線
Chinmaya Pati

これ1234は、著者が要求した言語からの単語です。あなたの言語はより制限的です。
Dmitry Kuzminov

4

私にとっては、英数字、数字、英数字を区別したいという問題があり、英数字の文字列に少なくとも1つの英数字と少なくとも1つの数字が含まれていることを確認するために、

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

まさに私が欲しいものです...ありがとう
Aniket kale '24

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

これは私にとってはうまくいき、O'Reillyの「Mastering Regular Expressions」で見つかりました。

/^\w+$/

説明:

  • ^文字列の先頭に位置をアサートします
    • \ w +は任意の単語文字に一致します([a-zA-Z0-9_]と同じ)
    • "+"数量詞— 1回から無制限の回数まで可能な限り多く一致し、必要に応じて返します(貪欲)
  • $は文字列の最後に位置を表明します

自分を確認します。

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.