none
正規表現 〇月、〇月~×月など RRS feed

  • 質問

  • 入力された文字を正規表現でチェックしたいと考えています。

    環境は以下の通りです。
    Visual Studio 2005
    .Net VB

    選択した内容にしたがって、文字列を月分をしめす文字列をつくっています。

    許可される形式として
    ①〇月
    ②〇月~×月
    ③〇月・×月
    があります。

    以下のようなコードで試してみたのですが、②が正しく判断できませんでした。

            Dim str As String = "1月"
        Dim bool As Boolean = False
        bool = System.Text.RegularExpressions.Regex.IsMatch(str, "^[1-12]月")
        Console.WriteLine(bool.ToString & "|" & str)
    
        str = "aaa1月"
        bool = System.Text.RegularExpressions.Regex.IsMatch(str, "^[1-12]月$")
        Console.WriteLine(bool.ToString & "|" & str)
    
        str = "1月~3月"
        bool = System.Text.RegularExpressions.Regex.IsMatch(str, "^[1-12]月~[1-12]月$")
        Console.WriteLine(bool.ToString & "|" & str)
    
        str = "1月~3月qqq"
        bool = System.Text.RegularExpressions.Regex.IsMatch(str, "^[1-12]月~[1-12]月$")
        Console.WriteLine(bool.ToString & "|" & str)
    
        str = "1月~qqq3月"
        bool = System.Text.RegularExpressions.Regex.IsMatch(str, "^[1-12]月~[1-12]月$")
        Console.WriteLine(bool.ToString & "|" & str)
    
        str = "1月・2月"
        bool = System.Text.RegularExpressions.Regex.IsMatch(str, "^[1-12]月・[1-12]月$")
        Console.WriteLine(bool.ToString & "|" & str)
    
        str = "1月・2月aaaaaa"
        bool = System.Text.RegularExpressions.Regex.IsMatch(str, "^[1-12]月・[1-12]月$")
        Console.WriteLine(bool.ToString & "|" & str)
    
        str = "1月aa・2月"
        bool = System.Text.RegularExpressions.Regex.IsMatch(str, "^[1-12]月・[1-12]月$")
        Console.WriteLine(bool.ToString & "|" & str)
    結果
    True|1月
    False|aaa1月
    False|1月~3月
    False|1月~3月qqq
    False|1月~qqq3月
    True|1月・2月
    False|1月・2月aaaaaa
    False|1月aa・2月

    ③も間違うならば、そもそも文法などの認識が間違っているのか、など考えるのですが、差がよくわかりません。
    ②は「月~」③は「月・」で同じケースだと思うのですが。

    以上です。よろしくお願いいたします。

     

    2010年6月17日 4:41

回答

  • [ ] の中は文字単位です。[1-12] だと、「文字コード順で 1 から 1 までのいずれか」「2」がマッチ対象になります。つまり、1 と 2 しか有効ではありません。

    複数文字のグルーピングには ( ) を使って ([1-9]|1[0-2]) などと記述します。これは、『「文字コード順で 1 から 9 までのいずれか」または「1 で始まり、次に文字コード順で 0 から 2 までのいずれかの文字が一文字続く文字列」』を意味します。

    • 回答としてマーク cis05 2010年6月17日 9:01
    2010年6月17日 4:57

すべての返信

  • [ ] の中は文字単位です。[1-12] だと、「文字コード順で 1 から 1 までのいずれか」「2」がマッチ対象になります。つまり、1 と 2 しか有効ではありません。

    複数文字のグルーピングには ( ) を使って ([1-9]|1[0-2]) などと記述します。これは、『「文字コード順で 1 から 9 までのいずれか」または「1 で始まり、次に文字コード順で 0 から 2 までのいずれかの文字が一文字続く文字列」』を意味します。

    • 回答としてマーク cis05 2010年6月17日 9:01
    2010年6月17日 4:57
  • HongLiangさん、ありがとうございます。

    すいません、基本的な文法が理解できていなかったということですね。
    12月が1と2だからTrueだったとは。

    もう一度MSDNあたりを確認して、いろいろなパターンを試してみようと思います。
    ありがとうございました。

    2010年6月17日 9:01