0

I tried to print out some information of the characters in C#.

The first example gives the output I expected.

public static void TestWorksAsExpected()
        {
            var i = 0;
            for (var c = char.MinValue; i <= char.MaxValue; i++, c++)
            {
                if (Regex.IsMatch(c.ToString(), "[a-zA-Z]"))
                {
                    Console.WriteLine($"index: {i} char: {c} ==> int:{(int) c} ==> hex:{(int) c:x}");
                }
            }
        }
    

The expected output is:

index: 65 char: A ==> int:65 ==> hex:41
index: 66 char: B ==> int:66 ==> hex:42
index: 67 char: C ==> int:67 ==> hex:43
index: 68 char: D ==> int:68 ==> hex:44
index: 69 char: E ==> int:69 ==> hex:45
index: 70 char: F ==> int:70 ==> hex:46
index: 71 char: G ==> int:71 ==> hex:47
index: 72 char: H ==> int:72 ==> hex:48
index: 73 char: I ==> int:73 ==> hex:49
index: 74 char: J ==> int:74 ==> hex:4a
index: 75 char: K ==> int:75 ==> hex:4b
index: 76 char: L ==> int:76 ==> hex:4c
index: 77 char: M ==> int:77 ==> hex:4d
index: 78 char: N ==> int:78 ==> hex:4e
index: 79 char: O ==> int:79 ==> hex:4f
index: 80 char: P ==> int:80 ==> hex:50
index: 81 char: Q ==> int:81 ==> hex:51
index: 82 char: R ==> int:82 ==> hex:52
index: 83 char: S ==> int:83 ==> hex:53
index: 84 char: T ==> int:84 ==> hex:54
index: 85 char: U ==> int:85 ==> hex:55
index: 86 char: V ==> int:86 ==> hex:56
index: 87 char: W ==> int:87 ==> hex:57
index: 88 char: X ==> int:88 ==> hex:58
index: 89 char: Y ==> int:89 ==> hex:59
index: 90 char: Z ==> int:90 ==> hex:5a
index: 97 char: a ==> int:97 ==> hex:61
index: 98 char: b ==> int:98 ==> hex:62
index: 99 char: c ==> int:99 ==> hex:63
index: 100 char: d ==> int:100 ==> hex:64
index: 101 char: e ==> int:101 ==> hex:65
index: 102 char: f ==> int:102 ==> hex:66
index: 103 char: g ==> int:103 ==> hex:67
index: 104 char: h ==> int:104 ==> hex:68
index: 105 char: i ==> int:105 ==> hex:69
index: 106 char: j ==> int:106 ==> hex:6a
index: 107 char: k ==> int:107 ==> hex:6b
index: 108 char: l ==> int:108 ==> hex:6c
index: 109 char: m ==> int:109 ==> hex:6d
index: 110 char: n ==> int:110 ==> hex:6e
index: 111 char: o ==> int:111 ==> hex:6f
index: 112 char: p ==> int:112 ==> hex:70
index: 113 char: q ==> int:113 ==> hex:71
index: 114 char: r ==> int:114 ==> hex:72
index: 115 char: s ==> int:115 ==> hex:73
index: 116 char: t ==> int:116 ==> hex:74
index: 117 char: u ==> int:117 ==> hex:75
index: 118 char: v ==> int:118 ==> hex:76
index: 119 char: w ==> int:119 ==> hex:77
index: 120 char: x ==> int:120 ==> hex:78
index: 121 char: y ==> int:121 ==> hex:79
index: 122 char: z ==> int:122 ==> hex:7a

    

Now to the part I don't understand: If I use RegexOptions.IgnoreCase then it puts out two aditional lines, and I just dont get why.

public static void DoesNotWorkAsExpected()
    {
        var i = 0;
        for (var c = char.MinValue; i <= char.MaxValue; i++, c++)
        {
            if (Regex.IsMatch(c.ToString(), "[a-zA-Z]", RegexOptions.IgnoreCase))
            {
                Console.WriteLine($"index: {i} char: {c} ==> int:{(int) c} ==> hex:{(int) c:x}");
            }
        }
    }
    

The unexpected output:

index: 65 char: A ==> int:65 ==> hex:41
index: 66 char: B ==> int:66 ==> hex:42
index: 67 char: C ==> int:67 ==> hex:43
index: 68 char: D ==> int:68 ==> hex:44
index: 69 char: E ==> int:69 ==> hex:45
index: 70 char: F ==> int:70 ==> hex:46
index: 71 char: G ==> int:71 ==> hex:47
index: 72 char: H ==> int:72 ==> hex:48
index: 73 char: I ==> int:73 ==> hex:49
index: 74 char: J ==> int:74 ==> hex:4a
index: 75 char: K ==> int:75 ==> hex:4b
index: 76 char: L ==> int:76 ==> hex:4c
index: 77 char: M ==> int:77 ==> hex:4d
index: 78 char: N ==> int:78 ==> hex:4e
index: 79 char: O ==> int:79 ==> hex:4f
index: 80 char: P ==> int:80 ==> hex:50
index: 81 char: Q ==> int:81 ==> hex:51
index: 82 char: R ==> int:82 ==> hex:52
index: 83 char: S ==> int:83 ==> hex:53
index: 84 char: T ==> int:84 ==> hex:54
index: 85 char: U ==> int:85 ==> hex:55
index: 86 char: V ==> int:86 ==> hex:56
index: 87 char: W ==> int:87 ==> hex:57
index: 88 char: X ==> int:88 ==> hex:58
index: 89 char: Y ==> int:89 ==> hex:59
index: 90 char: Z ==> int:90 ==> hex:5a
index: 97 char: a ==> int:97 ==> hex:61
index: 98 char: b ==> int:98 ==> hex:62
index: 99 char: c ==> int:99 ==> hex:63
index: 100 char: d ==> int:100 ==> hex:64
index: 101 char: e ==> int:101 ==> hex:65
index: 102 char: f ==> int:102 ==> hex:66
index: 103 char: g ==> int:103 ==> hex:67
index: 104 char: h ==> int:104 ==> hex:68
index: 105 char: i ==> int:105 ==> hex:69
index: 106 char: j ==> int:106 ==> hex:6a
index: 107 char: k ==> int:107 ==> hex:6b
index: 108 char: l ==> int:108 ==> hex:6c
index: 109 char: m ==> int:109 ==> hex:6d
index: 110 char: n ==> int:110 ==> hex:6e
index: 111 char: o ==> int:111 ==> hex:6f
index: 112 char: p ==> int:112 ==> hex:70
index: 113 char: q ==> int:113 ==> hex:71
index: 114 char: r ==> int:114 ==> hex:72
index: 115 char: s ==> int:115 ==> hex:73
index: 116 char: t ==> int:116 ==> hex:74
index: 117 char: u ==> int:117 ==> hex:75
index: 118 char: v ==> int:118 ==> hex:76
index: 119 char: w ==> int:119 ==> hex:77
index: 120 char: x ==> int:120 ==> hex:78
index: 121 char: y ==> int:121 ==> hex:79
index: 122 char: z ==> int:122 ==> hex:7a
index: 304 char: I ==> int:304 ==> hex:130
index: 8490 char: K ==> int:8490 ==> hex:212a

    

In my understanding there shouldn't be a difference in the output. Why does the second code print out these two aditional lines?

index: 304 char: I ==> int:304 ==> hex:130
index: 8490 char: K ==> int:8490 ==> hex:212a
Andie2302
  • 4,741
  • 3
  • 21
  • 39
  • https://stackoverflow.com/questions/796986/what-is-the-turkey-test – Johnathan Barclay Feb 22 '21 at 12:11
  • The `I ==> int:304 ==> hex:130`, is the _Unicode Character 'LATIN SMALL LETTER DOTLESS I' (U+0131)_. And the `K ==> int:8490 ==> hex:212a` is _Unicode Character 'KELVIN SIGN' (U+212A)_. Both are not in [a-zA-Z] range till you change the capitalisation. – Drag and Drop Feb 22 '21 at 13:23
  • Check the code here https://dotnetfiddle.net/fOJgvu Inmplemented your code and it works fine, I am using .net 5.0 as runtime, infact since its Ignore case you can change the Regex expression to ["a-z"] or ["A-Z"] and it would still work along with ["a-zA-Z"] – Mrinal Kamboj Feb 22 '21 at 14:14

0 Answers0