In which number set do I belong? Introduction
Mathematicians often work with number sets. These are groups of numbers that share common properties. These are number sets are, in order from most specific to most broad:
Natural numbers   (symbol N): These are the counting numbers: 1, 2, 3, ...
Integers          (symbol Z): These are all the numbers without a fractional part: ..., -3, -2, -1, 0, 1, 2, 3, ...
Rational numbers  (symbol Q): These numbers are the quotients of two integers, such as: 1.1 (11/10), 5.67 (567/100), or 0.333333333... (1/3)
-----The following two numbers sets are equally specific in describing numbers-----
Real numbers      (symbol R): These are positive, zero, and negative numbers, such as: π (3.1415926...), e (2.7182818...), or √2 (1.4142135...)
Imaginary numbers (symbol I): Numbers that give negative values when squared; for this reason they aren't very useful in everyday life.
                              These numbers contain the letter i in them, with i representing the √-1.
                              Examples: 2i, -1.5i 78i, 9i, -3.1415i, i
-----------------------------------------------------------------------------------
Complex numbers   (symbol C): The sum of a real and an imaginary number in the form a + bi, examples: 2 + 7i, 3 + 3i, 1 - i, -8 + i

Note that when there is only a single i, it is not written 1i.
Challenge
Given a number from one of these number sets, print the symbol for the most specific number set that could describe it.
Test cases
Input              Output
73.0            -&gt; N
4/2             -&gt; N
-73             -&gt; Z
-1/3            -&gt; Q
0.56            -&gt; Q
0.555...        -&gt; Q
0.123123123...  -&gt; Q
3.1415926535... -&gt; R
-1.37i          -&gt; I
7892/5 + 23/4i  -&gt; C

Other info

Natural numbers and integers may be given with a decimal point followed by a string of zeros
To add on to the previous point, any input that can be converted into a simpler form shall have its output corresponding to the simplified input
Rational numbers may be given with a / to represent a fraction, or a sequence of numbers occurring 3 or more times followed by ...
Numbers ending with ... represent repeated decimals or un-terminated decimal real numbers
Any number sets less specific than Q can also have inputs be given as a fraction
You do not need to handle repeated decimals or un-terminated decimals for number sets other than Q and R
Any error caused by lack of precision in floating point numbers will not invalidate a submission

This is code golf, so shortest code wins. If there is something unclear, let me know in the comments' section or edit the question.
JavaScript (ES6), 121 110 bytes

s=&gt;[...'QRCI'].find((_,i)=&gt;[/(.+)\1\1\.\./,/\.\./,/.+[+-].*i/,/i/][i].test(s))||'QNZ'[k=eval(s),k%1?0:k&gt;0?1:2]


Test cases



let f =

s=&gt;[...'QRCI'].find((_,i)=&gt;[/(.+)\1\1\.\./,/\.\./,/.+[+-].*i/,/i/][i].test(s))||'QNZ'[k=eval(s),k%1?0:k&gt;0?1:2]

console.log(f('73.0'           )) // -&gt; N
console.log(f('4/2'            )) // -&gt; N
console.log(f('-73'            )) // -&gt; Z
console.log(f('-1/3'           )) // -&gt; Q
console.log(f('0.56'           )) // -&gt; Q
console.log(f('0.555...'       )) // -&gt; Q
console.log(f('0.123123123...' )) // -&gt; Q
console.log(f('3.1415926535...')) // -&gt; R
console.log(f('-1.37i'         )) // -&gt; I
console.log(f('7892/5 + 23/4i' )) // -&gt; C




Formatted and commented

s =&gt;                  // given the input string s
  [...'QRCI'].find(   // we first apply some regular expressions:
    (_, i) =&gt; [       //   i = index
      /(.+)\1\1\.\./, //     i = 0 (Q): 3x the same pattern, followed by '..' -&gt; rational
      /\.\./,         //     i = 1 (R): '..' without the repeated pattern -&gt; real
      /.+[+-].*i/,    //     i = 2 (C): a real part +/- an imaginary part -&gt; complex
      /i/             //     i = 3 (I): just an imaginary part -&gt; imaginary
    ][i].test(s)      //   this is a find(), so we exit as soon as something matches
  ) || 'QNZ'[         // if all regular expressions failed:
    k = eval(s),      //   assume the expression can now be safely evaluated as JS code
    k % 1 ?           //   if there's a decimal part:
      0               //     -&gt; rational
    :                 //   else:
      k &gt; 0 ?         //     if strictly positive:
        1             //       -&gt; natural
      :               //     else:
        2             //       -&gt; integer
  ]                   //