private string ParseString(string s) { int readPos = 0; int len = s.Length; int writePos = 0; while (readPos < len) { char c = s[readPos++]; if (c == '\\') { if (readPos >= len) { throw new ArgumentException("Invalid escaped char in [" + s + "]"); } c = s[readPos++]; switch (c) { case '\\': c = '\\'; break; case 'n': c = '\n'; break; case 't': c = '\t'; break; case 'r': c = '\r'; break; case 'b': c = '\b'; break; case 'f': c = '\f'; break; case 'u': if (readPos + 3 >= len) { throw new ArgumentException("Invalid escaped char in [" + s + "]"); } // LUCENENET: Optimized parse so we don't allocate a substring c = (char)Integer.Parse(s, readPos, 4, radix: 16); readPos += 4; break; } } @out[writePos++] = c; } return(new string(@out, 0, writePos)); }
internal RegExp ParseRepeatExp() { RegExp e = ParseComplExp(); while (Peek("?*+{")) { if (Match('?')) { e = MakeOptional(e); } else if (Match('*')) { e = MakeRepeat(e); } else if (Match('+')) { e = MakeRepeat(e, 1); } else if (Match('{')) { int start = pos; while (Peek("0123456789")) { Next(); } if (start == pos) { throw new ArgumentException("integer expected at position " + pos); } // LUCENENET: Optimized so we don't allocate a substring during the parse int n = Integer.Parse(b, start, pos - start, radix: 10); int m = -1; if (Match(',')) { start = pos; while (Peek("0123456789")) { Next(); } if (start != pos) { // LUCENENET: Optimized so we don't allocate a substring during the parse m = Integer.Parse(b, start, pos - start, radix: 10); } } else { m = n; } if (!Match('}')) { throw new ArgumentException("expected '}' at position " + pos); } if (m == -1) { e = MakeRepeat(e, n); } else { e = MakeRepeat(e, n, m); } } } return(e); }