DIS>Regex comment = new Regex(@"/\*.*\*/", RegexOptions.IgnoreCase | RegexOptions.Singleline);
DIS>все комментарии свалились в 1 совпадения
Всё правильно. Не забывайте, что регэкспы — жадные

т.е. "*" бежала по совпадениям до тех пор, пока не упёрлась в последнюю "*/". Для таких случаев надо юзать ограничитель — "?":
/\*.*?\*/
Задача заключается в парсинге файла на предмет русскоязычных комментариев в файлах исходных кодов C/C++/C#
Необходимо выбрать все комментарии, содержащие минимум 1 русский символ.
string ruComment = @".*[а-яА-Я]+.*";
Regex comment = new Regex(@"(/\*" + ruComment + @"\*/)|(//" + ruComment + @"$\n)");
В таком случае в коллекцию совпадений падают все однострочные комментарии (вида // CommentContent) и часть многострочных (вида /* CommentContent */), если весь комментарий находится в одной строке.
Как нужно изменить паттерн, чтобы под него подходили все многострочные комментарии?
Возможно ли силами Regex объединять группу последовательно идуищх однострочных комментариев в один?
Зарание всем спасибо
DIS>>Как нужно изменить паттерн, чтобы под него подходили все многострочные комментарии?
T>Regex re = new Regex("regex", RegexOptions.IgnoreCase | RegexOptions.Singleline);
Скармливаю регексу
Regex comment = new Regex(@"/\*.*\*/", RegexOptions.IgnoreCase | RegexOptions.Singleline);
файл
http://www.rsdn.ru/File/56445/mytest.cpp
получаю 1 совпадение
http://www.rsdn.ru/File/56445/result.txt
все комментарии свалились в 1 совпадения, а надо чтобы каждый коммент падал в новый элемент коллекции совпадений
Здравствуйте, Thornik, Вы писали:
DIS>>Regex comment = new Regex(@"/\*.*\*/", RegexOptions.IgnoreCase | RegexOptions.Singleline);
DIS>>все комментарии свалились в 1 совпадения
T>Всё правильно. Не забывайте, что регэкспы — жадные
т.е. "*" бежала по совпадениям до тех пор, пока не упёрлась в последнюю "*/". Для таких случаев надо юзать ограничитель — "?":
T>/\*.*?\*/
Спасибо! Ограничитель помог! Осталась еще одна проблема..
У меня не получается дописать выбор *русскоязычных* комментариев. (русскоязычный комментарий в моей задаче — комментарий, содержащий минимум 1 символ [а-яА-Я])
Regex comment = new Regex(@"(/\*.*?\*/)|(//.*?\n)"
, RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.Compiled);
Это регекс, который вытаскивает все. Дальше я иду по коллекции мачей
MatchCollection matches = comment.Matches(filecontent);
foreach (Match match in matches)
{
if (Regex.IsMatch(match.Value, @"[а-яА-Я]+"))
.....
и таким образом выбираю только русские
Уверен, можно выбирать только русские комменты сразу.
Я пытался заменить тело комента в паттерне ".*" на что-то вроде ".*[а-яА-Я]+.*". В таком случае регекс не находил не одного из 850 русскоязычных комментов моей тестовой папки сорцов. Как можно описать тело русскоязычного коммента?
public string GetRussianComment(string str)
{
Regex exp = new Regex(@"(?<=/\*\s*)[А-я]+(?=\s*\*/)")
Match m = exp.Match(str);
if (!m.Empty)
{
return str.Substring(m.Index, m.Length)
}
return String.Empty
}
Пример:
если str is /* это мой русский коментарий */
тогда out
это мой русский комментарий
если str is /* this my english comment */
тогда out
пустая строка
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение