質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

4回答

3052閲覧

英文字で始まるコードの正規表現によるチェックは

ShukugawaSakura

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2019/06/21 09:13

編集2019/06/24 05:01

先頭に半角英文字(大文字小文字問わず)が少なくとも1文字あり、
その後に半角英文字(大文字小文字問わず)か半角数字が続き、
結果としてすべての長さが1以上16以下となっていることを判別するには、
正規表現でどのように記述すれば良いでしょうか。

知識が浅く、
^[A-Z][A-Z0-9]{1,16}$
みたいに書いてみたのですがうまくいきません。

すみません。よろしくお願いします。

参考までに、試したコードは、以下になります。


Visual Studio でForm1ウィンドウを作り、
テキストボックスを2つ(textBox1, textBox2)とボタン(button1)を貼ったものです。

textBox1には正規表現の文字列、textBox2にはチェックしたい文字列を入れます。
ボタンが押されるとbutton1_Clickイベントが起こり、Regex.IsMatch()で判定します。

例えば、正規表現に「^([A-Z]+[A-Z0-9]){1,16}$」
チェック対象に「ABc01235」を入れると、
自分的には、
・先頭が英文字
・続いて英文字と数字
・全体をかっこで囲ってそのながさが1以上16以下の指定
としているつもりですが、下記で"ERROR!!"のメッセージとなります。

Regex.IsMatch()関数に"RegexOptions.IgnoreCase"パラメータを与えているので、
英文字の大文字小文字は区別されないと解釈しています。

using System; using System.Text.RegularExpressions; // Regex, RegexOptions, 正規表現... using System.Windows.Forms; namespace Test0 {  public partial class Form1 : Form  {   public Form1()   {    InitializeComponent();   }   private void button1_Click(object sender, EventArgs e)   {    string validChars = textBox1.Text;    string code = textBox2.Text;    if (!(Regex.IsMatch(code, validChars, RegexOptions.IgnoreCase)))    {     MessageBox.Show("ERROR!!");    }   }  } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/06/21 09:30

チェックするためのうまくいかないコードをコンパイルできる形で最小限の物を作ってデータとともに書いてください。
ShukugawaSakura

2019/06/21 09:45

Visual Studio でForm1ウィンドウを作り、 テキストボックスを2つ(textBox1, textBox2)とボタン(button1)を貼ったものです。 textBox1には正規表現の文字列、textBox2にはチェックしたい文字列を入れます。 ボタンが押されるとbutton1_Clickイベントが起こり、Regex.IsMatch()で判定します。 例えば、正規表現に「^([A-Z]+[A-Z0-9]){1,16}$」 チェック対象に「ABc01235」を入れると、 自分的には、 ・先頭が英文字 ・続いて英文字と数字 ・全体をかっこで囲ってそのながさが1以上16以下の指定 としているつもりですが、下記で"ERROR!!"のメッセージとなります。 Regex.IsMatch()関数に"RegexOptions.IgnoreCase"パラメータを与えているので、 英文字の大文字小文字は区別されないと解釈しています。 すみません。 よろしくお願いします。 ==== using System; using System.Text.RegularExpressions; // Regex, RegexOptions, 正規表現... using System.Windows.Forms; namespace Test0 {  public partial class Form1 : Form  {   public Form1()   {    InitializeComponent();   }   private void button1_Click(object sender, EventArgs e)   {    string validChars = textBox1.Text;    string code = textBox2.Text;    if (!(Regex.IsMatch(code, validChars, RegexOptions.IgnoreCase)))    {     MessageBox.Show("ERROR!!");    }   }  } }
退会済みユーザー

退会済みユーザー

2019/06/22 01:46 編集

上記追加情報は質問の本文を編集して質問文内に追記していただくようお願いします。コメント欄は通常閉じられていて見落とされることがありますので。
ShukugawaSakura

2019/06/24 00:02

ご指摘ありがとうございます。 不慣れなものですみません。 今回は既にみなさまからアドバイスいただけましたので貼り直しませんが、 次回からは気をつけます。
退会済みユーザー

退会済みユーザー

2019/06/24 04:47

今からでも質問本文に追記してください。後からここを訪れた閲覧者に分かりやすくするため(=情報を蓄積して広く役に立つようにするというサイトの目的に沿って、このスレッドの価値を高めるため)にお願いします。
guest

回答4

0

ベストアンサー

以下のようにしてできると思います。

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Text.RegularExpressions; namespace ConsoleAppRegex { class Program { static void Main(string[] args) { Regex rx = new Regex(@" ^ # 開始のアンカー [a-zA-Z]{1} # 先頭に半角英文字(大文字小文字問わず)が少なくとも1文字 [a-zA-Z0-9] # その後に半角英文字(大文字小文字問わず)か半角数字が続き {0,15} # 結果としてすべての長さが1以上16以下 $ # 終了のアンカー", RegexOptions.IgnorePatternWhitespace); string[] tests = {"ABc01235", "0ABCdef123", "x123456789012345", "x1234567890123456", "x","あいうえお", "ABc-01235", ""}; foreach (string test in tests) { if (rx.IsMatch(test)) { Console.WriteLine($"{test}: Match"); } else { Console.WriteLine($"{test}: Unmatch"); } } // 結果は: // ABc01235: Match // 0ABCdef123: Unmatch // x123456789012345: Match // x1234567890123456: Unmatch // x: Match // あいうえお: Unmatch // ABc-01235: Unmatch // : Unmatch } } }

投稿2019/06/22 01:17

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ShukugawaSakura

2019/06/24 00:02

丁寧な解説までいただいてありがとうございます。 腑に落ちました。 みなさんからアドバイスいただいてとても役に立ったので、 ベストアンサーを選ぶのが難しいのですが、 詳しく解説くださったSurferOnWwwさんにさせていただきました。 ありがとうございました。
guest

0

[A-Z0-9]
→小文字許可してない

お二方の例をまとめると正規表現では^[A-Z][A-Z0-9]{0,15}$

ただ、私は正規表現があまり好きではなく、こういうのを書きたくなります。

csharp

1static bool IsValid(string stem) => stem.Length <= 16 && stem.Length >= 1 && (stem.All(c => Char.IsUpper(c) || Char.IsLower(c) || char.IsDigit(c))) && !Char.IsDigit(stem[0]);

投稿2019/06/21 11:03

編集2019/06/21 14:07
papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/06/21 11:18

RegexOptions.IgnoreCase は大文字小文字を区別しないオプションです。
papinianus

2019/06/21 11:26

先頭が英大文字と読み違えてオプションスルーしてました。失礼しました。かなり後で書き換えます
ShukugawaSakura

2019/06/23 23:59

papinianus さん、 回答いただきありがとうございます。 なるほどラムダ式で書くと、判定したいことが分かりやすいです。 参考になりました。 ありがとうございました。
guest

0

正規表現と検索対象が逆です。入れ替えてください。

追記

見間違えていました。順番は合っています。
正規表現は次のようにしてください。
^[A-Z][A-Z0-9]{1,15}$

投稿2019/06/21 09:50

編集2019/06/21 11:17
Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2019/06/21 11:03

input, patternの順ですよね。合ってませんか?
Zuishin

2019/06/21 11:17

合ってましたね。見間違えたようです。ありがとうございます。
papinianus

2019/06/21 11:24

2文字以上16文字以下なので要件の下限を一文字満たしていないと思います
Zuishin

2019/06/21 11:35

本当ですね。{0,15} でした。私は気づかなかったので回答お願いします。
ShukugawaSakura

2019/06/23 23:57

Zuishinさん、回答ありがとうございます。 理解ができました。 どうもありがとうございました。
guest

0

大文字小文字問わず

^[a-zA-Z][a-zA-Z0-9]{,15}$

とか?

投稿2019/06/21 09:35

yambejp

総合スコア114812

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ShukugawaSakura

2019/06/21 09:51

早速回答いただきありがとうございます。 Zuishinさんからの指摘に従って雑プロのコードを上げたのですが、 そのプログラムで実験すると、 ^[a-zA-Z][a-zA-Z0-9]{,15}$ の正規表現で ABc01235 がアンマッチとなりました。 でも、正規表現の内容は(私なりに)理解できるので、 雑プロの方が間違っているのかもしれません。 見直してみます。
papinianus

2019/06/21 11:22 編集

これがマッチしないのは{,15}をサポートしてないからではないでしょうか。{0,15}であればABc01235にマッチしました。環境はmacの.Net CORE2.2ですが
ShukugawaSakura

2019/06/23 23:51

papinianusさん、アドバイスありがとうございます。 そのとおりでした。{0,15}で動作しました。 yambejpさん、どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問