Ejemplo n.º 1
0
		/// <summary>
		/// 扫描 '\'(不包含 '\' 本身)之后的字符,并返回相应的正则表达式。
		/// </summary>
		/// <returns>相应的正则表达式。</returns>
		private Regex ScanBackslash()
		{
			RegexCharClass cc;
			int ich;
			switch (ich = reader.Read())
			{
				case 'w':
					return Regex.CharClass(
						UseOptionEcma ? RegexCharClass.EcmaWordClass : RegexCharClass.WordClass);
				case 'W':
					return Regex.CharClass(
						UseOptionEcma ? RegexCharClass.NotEcmaWordClass : RegexCharClass.NotWordClass);
				case 's':
					return Regex.CharClass(
						UseOptionEcma ? RegexCharClass.EcmaSpaceClass : RegexCharClass.SpaceClass);
				case 'S':
					return Regex.CharClass(
						UseOptionEcma ? RegexCharClass.NotEcmaSpaceClass : RegexCharClass.NotSpaceClass);
				case 'd':
					return Regex.CharClass(
						UseOptionEcma ? RegexCharClass.EcmaDigitClass : RegexCharClass.DigitClass);
				case 'D':
					return Regex.CharClass(
						UseOptionEcma ? RegexCharClass.NotEcmaDigitClass : RegexCharClass.NotDigitClass);
				case 'p':
				case 'P':
					cc = new RegexCharClass();
					cc.AddCategoryFromName(ScanProperty(), ich != 'p', UseOptionIgnoreCase, pattern);
					if (UseOptionIgnoreCase)
					{
						cc.AddLowercase(culture);
					}
					return Regex.CharClass(cc.ToStringClass());
				case -1:
					ThrowIllegalEndEscape();
					return null;
				default:
					reader.Unget();
					char ch = ScanCharEscape();
					if (UseOptionIgnoreCase)
					{
						return Regex.SymbolIgnoreCase(ch, culture);
					}
					else
					{
						return Regex.Symbol(ch);
					}
			}
		}
Ejemplo n.º 2
0
		/// <summary>
		/// 扫描 '\'(不包含 '\' 本身)之后的字符,并返回相应的字符。
		/// </summary>
		/// <param name="rcc">要添加到的字符类。</param>
		/// <param name="inRange">当前是否正在定义字符范围。</param>
		/// <returns>相应的字符,如果不是字符,则为 <c>-1</c>。</returns>
		private int ScanBackslash(RegexCharClass rcc, bool inRange)
		{
			// 判断 '\' 字符的转义。
			int ich = reader.Read();
			switch (ich)
			{
				case 'D':
				case 'd':
					if (inRange)
					{
						ThrowBadClassInCharRange((char)ich);
					}
					rcc.AddDigit(UseOptionEcma, ich == 'D', pattern);
					return -1;
				case 'S':
				case 's':
					if (inRange)
					{
						ThrowBadClassInCharRange((char)ich);
					}
					rcc.AddSpace(UseOptionEcma, ich == 'S');
					return -1;
				case 'W':
				case 'w':
					if (inRange)
					{
						ThrowBadClassInCharRange((char)ich);
					}
					rcc.AddWord(UseOptionEcma, ich == 'W');
					return -1;
				case 'p':
				case 'P':
					if (inRange)
					{
						ThrowBadClassInCharRange((char)ich);
					}
					rcc.AddCategoryFromName(ScanProperty(), (ich != 'p'), UseOptionIgnoreCase, pattern);
					return -1;
				default:
					reader.Unget();
					// 读入转义字符。
					return ScanCharEscape();
			}
		}