У меня проблема, когда я использую другое регулярное выражение для выделения слов и комментариев в документе (RichEditControl), например SQL.Regex for Highlight
Это мое первое регулярное выражение:
(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(--.*)
Это хорошо работает в: /*blahblah*/
и --blahblah
И у меня есть еще одно регулярное выражение:
((""(.|/[[:blank:]]/)*?"")|('(.|/[[:blank:]]/)*?'))
Это работает хорошо в: 'blahblah'
(например, sql string)
Но, если я сделать это:
'/*blahblah*/'
Перед тем, как написать последний '
программа показывает мне исключение:
необработанное исключение типа «System.ArgumentException» произошло в DevExpress.Office.v15.2. Core.dll
Заранее благодарим за помощь.
Это полный код:
private List<SyntaxHighlightToken> ParseTokens()
{
List<SyntaxHighlightToken> tokens = new List<SyntaxHighlightToken>();
DocumentRange[] ranges = null;
#region SearchSimpleCommas
Regex quotations = new Regex(@"((""(.|/[[:blank:]]/)*?"")|('(.|/[[:blank:]]/)*?'))");
ranges = document.FindAll(quotations);
foreach (var range in ranges)
{
if (!IsRangeInTokens(range, tokens))
tokens.Add(new SyntaxHighlightToken(range.Start.ToInt(), range.Length, StringSettings));
}
#endregion
#region SearchComment--/**/
Regex comment = new Regex(@"(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(--.*)", RegexOptions.IgnoreCase | RegexOptions.Multiline);
ranges = document.FindAll(comment);
for (int i = 0; i < ranges.Length; i++)
{
tokens.Add(new SyntaxHighlightToken(ranges[i].Start.ToInt(), ranges[i].Length, CommentsSettings));
}
#endregion
tokens.Sort(new SyntaxHighlightTokenComparer());
// fill in gaps in document coverage
AddPlainTextTokens(tokens);
return tokens;
}
private void AddPlainTextTokens(List<SyntaxHighlightToken> tokens)
{
int count = tokens.Count;
if (count == 0)
{
tokens.Add(new SyntaxHighlightToken(0, document.Range.End.ToInt(), defaultSettings));
return;
}
tokens.Insert(0, new SyntaxHighlightToken(0, tokens[0].Start, defaultSettings));
for (int i = 1; i < count; i++)
{
tokens.Insert(i * 2, new SyntaxHighlightToken(tokens[i * 2 - 1].End, tokens[i * 2].Start - tokens[i * 2 - 1].End, defaultSettings));
}
tokens.Add(new SyntaxHighlightToken(tokens[count * 2 - 1].End, document.Range.End.ToInt() - tokens[count * 2 - 1].End, defaultSettings));
}
private bool IsRangeInTokens(DocumentRange range, List<SyntaxHighlightToken> tokens)
{
return tokens.Any(t => IsIntersect(range, t));
}
bool IsIntersect(DocumentRange range, SyntaxHighlightToken token)
{
int start = range.Start.ToInt();
if (start >= token.Start && start < token.End)
return true;
int end = range.End.ToInt() - 1;
if (end >= token.Start && end < token.End)
return true;
return false;
}
#region ISyntaxHighlightServiceMembers
public void ForceExecute()
{
Execute();
}
public void Execute()
{//The Exepction show in this part
document.ApplySyntaxHighlight(ParseTokens());
}
#endregion
EDIT: Спасибо Харрисон Mc.
делюсь код я использовал в случае, если кто нуждается в этом, только то, что я изменил (внутри метода ParseTokens):
#region SearchComments&Strings
Regex definitiveRegex = new Regex(@"(?<string>'[^\\']*(?>\\.[^\\']*)*')|(?<comment>(?>/\*(?>[^*]|[\r\n]|(?>\*+(?>[^*/]|[\r\n])))*\*+/)|(?>--.*))");
MatchCollection matches = definitiveRegex.Matches(document.Text);
foreach (System.Text.RegularExpressions.Match match in matches)
{
try
{
System.Text.RegularExpressions.GroupCollection groups = match.Groups;
if (groups["string"].Value.Length > 0)
{
ranges = null;
for (int s = 0; s < groups.Count; s++)
{
if (groups[s].Value != string.Empty)
{
ranges = document.FindAll(groups[s].Value, SearchOptions.None);
for (int z = 0; z < ranges.Length; z++)
{
if(!IsRangeInTokens(ranges[z], tokens))
tokens.Add(new SyntaxHighlightToken(ranges[z].Start.ToInt(), ranges[z].Length, StringSettings));
}
}
}
}
else if (groups["comment"].Value.Length > 0)
{
ranges = null;
for (int c = 0; c < groups.Count; c++)
{
if (groups[c].Value != string.Empty)
{
ranges = document.FindAll(groups[c].Value.Trim(), SearchOptions.None);
for (int k = 0; k < ranges.Length; k++)
{
if (!IsRangeInTokens(ranges[k], tokens))
tokens.Add(new SyntaxHighlightToken(ranges[k].Start.ToInt(), ranges[k].Length, CommentsSettings));
}
}
}
}
}
catch(Exception ex){ }
}
#endregion
Я не знаю, что это проблема * (я слишком устал для этого:)) *, но: '[^ *] 'уже включает CR и LF, вам не нужно добавлять' | [\ r \ n] '. Простой шаблон для сопоставления C-многострочных комментариев: '/ \ * [^ *] * (?> \ * + (?! /) [^ *] *) * \ * /' –
О цитируемых строках: вы можете использовать что-то например: ''[^ \\'] * (?> \\. [^ \\ '] *) *' |" [^ \\ "] * (?> \\. [^ \\"] *) * "' –