我想在C#中使用正则表达式来表示多行注释。我有@"/[*][\w\d\s]+[*]/"
但是只有那个表达式才会评论单行中/ * * /之间出现的文字而不是多行。
SINGLELINE:
/* xxxxxxxx */
多:
/*
xxxxxxx
*/
我不知道我是否可以解释得很好,但是如果您有任何问题或者如果您可以参考提供这些信息的地方,我将不胜感激。
EDIT 在我的例子中,我有一个班级
。 。
public IList<ClassificationSpan> GetClassificationSpans(SnapshotSpan span)
{
List<ClassificationSpan> classifications = new List<ClassificationSpan>();
string current = span.GetText();
bool commentFound = false;
foreach(var item in _colorTextoLanguage.Comments)
{
Regex reg = new Regex(item, RegexOptions.IgnoreCase);
var matches = reg.Matches(current);
for(int i=0;i<matches.Count;i++)
{
commentFound = true;
Match m =matches[i];
Span new_span = new Span(span.Start.Position + m.Index, current.Length - m.Index);
SnapshotSpan new_snapshot = new SnapshotSpan(span.Snapshot, new_span);
var newText = new_snapshot.GetText();
classifications.Add(new ClassificationSpan(new_snapshot, _commentType));
}
}
if(commentFound)
return classifications;
Classify(classifications, current, span, _colorTextoLanguage.Custom, _classificationType);
Classify(classifications, current, span, _colorTextoLanguage.Quoted, _stringType);
Classify(classifications, current, span, _colorTextoLanguage.Keywords, _keywordType);
Classify(classifications, current, span, _colorTextoLanguage.IdentifierTypes, _identifierType);
Classify(classifications, current, span, _colorTextoLanguage.Numeric, _numericType);
return classifications;
}
。 。
和其他课程
class ColorTextoLanguage
{
#region Member Variables
private List<string> _comments = new List<string>();
private List<string> _quoted = new List<string>();
private List<string> _numeric = new List<string>();
private List<string> _keywords = new List<string>();
private List<string> _identiferTypes = new List<string>();
private List<string> _custom = new List<string>();
#region Properties
public List<string> Comments
{
get{return _comments;}
}
public List<string> Quoted
{
get{return _quoted;}
}
public List<string> Numeric
{
get{return _numeric;}
}
public List<string> Keywords
{
get{return _keywords;}
}
public List<string> IdentifierTypes
{
get{return _identifierTypes;}
}
public List<string> Custom
{
get{return _custom;}
}
#endregion
#region ctor
public ColorTextoLanguage()
{
Initialize();
}
#endregion
#region Methods
private void Initialize()
{
_comments.Add("//");
_comments.Add(@"/\*(?:(?!\*/)(?:.|[\r\n]+))*\*/");
_quoted.Add(@"([""'])(?:\\\1|.)*?\1");
_numeric.Add(@"\b\d+\b")
_keywords.Add(@"\bif\b");
_keywords.Add(@"\belse\b");
_keywords.Add(@"\bforeach\b");
_keywords.Add(@"\bswitch\b");
_keywords.Add(@"\bcase\b");
.
.
.
_identifierTypes.Add(@"\bint\b");
_identifierTypes.Add(@"\bdate\b");
_identifierTypes.Add(@"\bstring\b");
.
.
.
}
#endregion
#endregion
};
不确定这是否有帮助,但从我看到的与你的例子非常相似。 感谢addvance
答案 0 :(得分:2)
试试正则表达式:
/\*(?:(?!\*/).)*\*/
使用RegexOptions.Singleline
new Regex(@"/\*(?:(?!\*/).)*\*/", RegexOptions.Singleline);
(?:(?!\*/).)*
将匹配除*/
编辑:版本应该在两种模式下都有效:
/\*(?:(?!\*/)(?:.|[\r\n]+))*\*/
答案 1 :(得分:0)
/\*([^*]*\*)*?/
/\*
匹配正斜线后跟星号
([^*]*\*)*?
(将不是文字星号的所有内容与零无限次匹配,然后匹配文字星号),懒惰地执行零次或无限次
/
匹配正向斜线。如果失败,则回溯到上一步并再尝试一次懒惰迭代。
这不仅更短更清晰,而且还需要更少的正则表达式执行。这是最有效的方式。
注意:无需担心收藏。但是如果你真的在乎,你可以使你的小组成为?:
/\*(?:[^*]*\*)*?/
答案 2 :(得分:0)
要匹配多行注释,您需要一个简单的正则表达式:
Regex regex = new Regex(@"/\*.*?\*/", RegexOptions.Singleline);
希望这可以帮助您完成任务。
答案 3 :(得分:0)
这个问题根本不是正则表达式。这不起作用的原因是,任何时候只有一行代码被传递到GetClassificationSpans()函数中。我遇到了与您相同的问题,根据您提供的代码,我们遵循相同的教程。
这不是一个真正的答案,它只会帮助您确定实际问题是什么。