class SyntaxEngine
{
/// <summary>
/// 语法项
/// </summary>
public class SyntaxItem
{
private string FPattern; // 正则表达式
private RegexOptions FOptions; // 正则表达式附加选项
private string FName; // 语法名称
private int FIndex; // 序号 public string Pattern { get { return FPattern; } } // 正则表达式
public RegexOptions Options { get { return FOptions; } } // 正则表达式附加选项
public string Name { get { return FName; } } // 名称
public int Index { get { return FIndex; } } // 序号 public SyntaxItem(string APattern, RegexOptions AOptions,
string AName, int AIndex)
{
FPattern = APattern;
FOptions = AOptions;
FName = AName;
FIndex = AIndex;
}
}
/// <summary>
/// 语法分析返回项
/// </summary>
public class AnalyzeReslut
{
private SyntaxItem FItem; // 所属语法项
private string FBlock; // 文字块 public SyntaxItem Item { get { return FItem; } }
public string Block { get { return FBlock; } } public AnalyzeReslut(SyntaxItem AItem, string ABlock)
{
FItem = AItem;
FBlock = ABlock;
}
} private List<SyntaxItem> FSyntaxItems = new List<SyntaxItem>();
private List<AnalyzeReslut> FAnalyzeResluts = new List<AnalyzeReslut>(); public List<SyntaxItem> SyntaxItems { get { return FSyntaxItems; } }
public List<AnalyzeReslut> AnalyzeResluts { get { return FAnalyzeResluts; } }
/// <summary>
/// 进行语法分析
/// </summary>
/// <param name="ACode">所分析的代码</param>
/// <returns>返回分析是否成功</returns>
public virtual bool Analyze(string ACode)
{
if (FSyntaxItems.Count <= 0) return false;
if (ACode == null) return false;
AnalyzeResluts.Clear();
string vCode = ACode;
bool vFind = true;
while (vFind && (vCode.Length > 0))
{
vFind = false;
foreach (SyntaxItem vSyntaxItem in FSyntaxItems)
{
if (Regex.IsMatch(vCode, vSyntaxItem.Pattern, vSyntaxItem.Options))
{
AnalyzeResluts.Add(new AnalyzeReslut(vSyntaxItem,
Regex.Match(vCode, vSyntaxItem.Pattern,
vSyntaxItem.Options).Value));
vCode = Regex.Replace(vCode, vSyntaxItem.Pattern, "",
vSyntaxItem.Options);
vFind = true;
break;
}
}
}
return true;
}
} /// <summary>
/// C#语法分析引擎
/// </summary>
class CSharpEngine : SyntaxEngine
{
public CSharpEngine()
{
SyntaxItems.Add(new SyntaxItem(@"^\s+", RegexOptions.None,
"空白", SyntaxItems.Count));
SyntaxItems.Add(new SyntaxItem(@"^\/\/[^\n]*[\n]?", RegexOptions.None,
"单行注释", SyntaxItems.Count));
SyntaxItems.Add(new SyntaxItem(@"^\/\*.*?\*\/", RegexOptions.None,
"多行注释", SyntaxItems.Count));
SyntaxItems.Add(new SyntaxItem(@"^#\s*(define|elif|else|endif|endregion|" +
@"error|if|line|pragma|region|undef|using|warning)\b[^\n]*[\n]?",
RegexOptions.None, "指令", SyntaxItems.Count));
SyntaxItems.Add(new SyntaxItem(@"^(abstract|event|new|struct|as|explicit|" +
@"null|switch|base|extern|object|this|bool|false|operator|throw|break|" +
@"finally|out|true|byte|fixed|override|try|case|float|params|typeof|" +
@"catch|for|private|uint|char|foreach|protected|ulong|checked|goto|" +
@"public|unchecked|class|if|readonly|unsafe|const|implicit|ref|ushort|" +
@"continue|in|return|using|decimal|int|sbyte|virtual|default|interface|" +
@"sealed|volatile|delegate|internal|short|void|do|is|sizeof|while|" +
@"double|lock|stackalloc|else|long|static|enum|namespace|string)\b",
RegexOptions.None, "关键字", SyntaxItems.Count));
SyntaxItems.Add(new SyntaxItem(@"^(get|partial|set|value|where|yield)\b",
RegexOptions.None, "上下文关键字", SyntaxItems.Count));
SyntaxItems.Add(new SyntaxItem(@"^(\+\=|\-\=|\&\&|\|\||\/\=|\&\=|\%\=|\~|\!|\+\+|\-\-|" +
@"\#|\$|\%|\^|\&|\*|\(|\)|\+|\-|\=|\{|\}|\[|\]|\\|\;|\:|\<|\>|\?|\,|\.|\/)+",
RegexOptions.None, "标点符号", SyntaxItems.Count));
SyntaxItems.Add(new SyntaxItem(@"^(\d+(?!\.|x|e|d|m)u?)|^0x([\da-f]+(?!\.|x|m)u?)",
RegexOptions.IgnoreCase, "整数", SyntaxItems.Count));
SyntaxItems.Add(new SyntaxItem(@"^(\d+)?\.\d+((\+|\-)?e\d+)?(m|d|f)?|^\d+((\+|\-)?e\d+)?(m|d|f)",
RegexOptions.IgnoreCase, "浮点数", SyntaxItems.Count));
SyntaxItems.Add(new SyntaxItem(@"^@""(("""")*([^""])*)*""|^""((\\\\)*(\\"")*(\\[a-z])*[^""^\\]*)*""",
RegexOptions.None, "字符串", SyntaxItems.Count));
SyntaxItems.Add(new SyntaxItem(@"^\'(\\\')*[^\']*\'", RegexOptions.None,
"字符", SyntaxItems.Count));
SyntaxItems.Add(new SyntaxItem(@"^\w*", RegexOptions.None,
"标识符", SyntaxItems.Count));
}
}
如何调用这个正则类,在RichTextBox中实时的做到语法关键字高亮的处理
{
/// <summary>
/// 语法项
/// </summary>
public class SyntaxItem
{
private string FPattern; // 正则表达式
private RegexOptions FOptions; // 正则表达式附加选项
private string FName; // 语法名称
private int FIndex; // 序号 public string Pattern { get { return FPattern; } } // 正则表达式
public RegexOptions Options { get { return FOptions; } } // 正则表达式附加选项
public string Name { get { return FName; } } // 名称
public int Index { get { return FIndex; } } // 序号 public SyntaxItem(string APattern, RegexOptions AOptions,
string AName, int AIndex)
{
FPattern = APattern;
FOptions = AOptions;
FName = AName;
FIndex = AIndex;
}
}
/// <summary>
/// 语法分析返回项
/// </summary>
public class AnalyzeReslut
{
private SyntaxItem FItem; // 所属语法项
private string FBlock; // 文字块 public SyntaxItem Item { get { return FItem; } }
public string Block { get { return FBlock; } } public AnalyzeReslut(SyntaxItem AItem, string ABlock)
{
FItem = AItem;
FBlock = ABlock;
}
} private List<SyntaxItem> FSyntaxItems = new List<SyntaxItem>();
private List<AnalyzeReslut> FAnalyzeResluts = new List<AnalyzeReslut>(); public List<SyntaxItem> SyntaxItems { get { return FSyntaxItems; } }
public List<AnalyzeReslut> AnalyzeResluts { get { return FAnalyzeResluts; } }
/// <summary>
/// 进行语法分析
/// </summary>
/// <param name="ACode">所分析的代码</param>
/// <returns>返回分析是否成功</returns>
public virtual bool Analyze(string ACode)
{
if (FSyntaxItems.Count <= 0) return false;
if (ACode == null) return false;
AnalyzeResluts.Clear();
string vCode = ACode;
bool vFind = true;
while (vFind && (vCode.Length > 0))
{
vFind = false;
foreach (SyntaxItem vSyntaxItem in FSyntaxItems)
{
if (Regex.IsMatch(vCode, vSyntaxItem.Pattern, vSyntaxItem.Options))
{
AnalyzeResluts.Add(new AnalyzeReslut(vSyntaxItem,
Regex.Match(vCode, vSyntaxItem.Pattern,
vSyntaxItem.Options).Value));
vCode = Regex.Replace(vCode, vSyntaxItem.Pattern, "",
vSyntaxItem.Options);
vFind = true;
break;
}
}
}
return true;
}
} /// <summary>
/// C#语法分析引擎
/// </summary>
class CSharpEngine : SyntaxEngine
{
public CSharpEngine()
{
SyntaxItems.Add(new SyntaxItem(@"^\s+", RegexOptions.None,
"空白", SyntaxItems.Count));
SyntaxItems.Add(new SyntaxItem(@"^\/\/[^\n]*[\n]?", RegexOptions.None,
"单行注释", SyntaxItems.Count));
SyntaxItems.Add(new SyntaxItem(@"^\/\*.*?\*\/", RegexOptions.None,
"多行注释", SyntaxItems.Count));
SyntaxItems.Add(new SyntaxItem(@"^#\s*(define|elif|else|endif|endregion|" +
@"error|if|line|pragma|region|undef|using|warning)\b[^\n]*[\n]?",
RegexOptions.None, "指令", SyntaxItems.Count));
SyntaxItems.Add(new SyntaxItem(@"^(abstract|event|new|struct|as|explicit|" +
@"null|switch|base|extern|object|this|bool|false|operator|throw|break|" +
@"finally|out|true|byte|fixed|override|try|case|float|params|typeof|" +
@"catch|for|private|uint|char|foreach|protected|ulong|checked|goto|" +
@"public|unchecked|class|if|readonly|unsafe|const|implicit|ref|ushort|" +
@"continue|in|return|using|decimal|int|sbyte|virtual|default|interface|" +
@"sealed|volatile|delegate|internal|short|void|do|is|sizeof|while|" +
@"double|lock|stackalloc|else|long|static|enum|namespace|string)\b",
RegexOptions.None, "关键字", SyntaxItems.Count));
SyntaxItems.Add(new SyntaxItem(@"^(get|partial|set|value|where|yield)\b",
RegexOptions.None, "上下文关键字", SyntaxItems.Count));
SyntaxItems.Add(new SyntaxItem(@"^(\+\=|\-\=|\&\&|\|\||\/\=|\&\=|\%\=|\~|\!|\+\+|\-\-|" +
@"\#|\$|\%|\^|\&|\*|\(|\)|\+|\-|\=|\{|\}|\[|\]|\\|\;|\:|\<|\>|\?|\,|\.|\/)+",
RegexOptions.None, "标点符号", SyntaxItems.Count));
SyntaxItems.Add(new SyntaxItem(@"^(\d+(?!\.|x|e|d|m)u?)|^0x([\da-f]+(?!\.|x|m)u?)",
RegexOptions.IgnoreCase, "整数", SyntaxItems.Count));
SyntaxItems.Add(new SyntaxItem(@"^(\d+)?\.\d+((\+|\-)?e\d+)?(m|d|f)?|^\d+((\+|\-)?e\d+)?(m|d|f)",
RegexOptions.IgnoreCase, "浮点数", SyntaxItems.Count));
SyntaxItems.Add(new SyntaxItem(@"^@""(("""")*([^""])*)*""|^""((\\\\)*(\\"")*(\\[a-z])*[^""^\\]*)*""",
RegexOptions.None, "字符串", SyntaxItems.Count));
SyntaxItems.Add(new SyntaxItem(@"^\'(\\\')*[^\']*\'", RegexOptions.None,
"字符", SyntaxItems.Count));
SyntaxItems.Add(new SyntaxItem(@"^\w*", RegexOptions.None,
"标识符", SyntaxItems.Count));
}
}
如何调用这个正则类,在RichTextBox中实时的做到语法关键字高亮的处理
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货