public static int CountWhileNot(this string str, int start, CharSet chars, long max = int.MaxValue)
 {
     var index = start;
     max = Math.Min(index + max, str.Length);
     while (index < max && !chars.Contains(str[start]))
     {
         index += 1;
     }
     return index - start;
 }
 public static int CountWhileNot(this Subject subject, CharSet chars, long max = int.MaxValue)
 {
     var start = subject.Index;
     var index = start;
     max = Math.Min(start + max, subject.Text.Length);
     while (index < max && !chars.Contains(subject.Text[index]))
     {
         index += 1;
     }
     return index - start;
 }
 public static string TakeWhile(this Subject subject, CharSet chars, long max = int.MaxValue)
 {
     var start = subject.Index;
     var index = start;
     max = Math.Min(start + max, subject.Text.Length);
     while (index < max && chars.Contains(subject.Text[index]))
     {
         index += 1;
     }
     return index > start ? subject.Take(index - start) : "";
 }
 public CharSet(CharSet chars)
     : this(chars.Chars)
 {
 }