Regex pattern для русских комментариев в исходниках C/C++/C#
От: -DIS-  
Дата: 04.07.06 09:40
Оценка:
Задача заключается в парсинге файла на предмет русскоязычных комментариев в файлах исходных кодов C/C++/C#
Необходимо выбрать все комментарии, содержащие минимум 1 русский символ.


string ruComment = @".*[а-яА-Я]+.*";
Regex comment = new Regex(@"(/\*" + ruComment + @"\*/)|(//" + ruComment + @"$\n)");

В таком случае в коллекцию совпадений падают все однострочные комментарии (вида // CommentContent) и часть многострочных (вида /* CommentContent */), если весь комментарий находится в одной строке.

Как нужно изменить паттерн, чтобы под него подходили все многострочные комментарии?
Возможно ли силами Regex объединять группу последовательно идуищх однострочных комментариев в один?

Зарание всем спасибо
Re: Regex pattern для русских комментариев в исходниках C/C+
От: Thornik  
Дата: 04.07.06 10:54
Оценка: 2 (1)
DIS>Как нужно изменить паттерн, чтобы под него подходили все многострочные комментарии?

Regex re = new Regex("regex", RegexOptions.IgnoreCase | RegexOptions.Singleline);


DIS>Возможно ли силами Regex объединять группу последовательно идуищх однострочных комментариев в один?


Нельзя.
Re[2]: Regex pattern для русских комментариев в исходниках C
От: -DIS-  
Дата: 04.07.06 14:52
Оценка:
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 совпадения, а надо чтобы каждый коммент падал в новый элемент коллекции совпадений
Re[3]: Regex pattern для русских комментариев в исходниках C
От: Thornik  
Дата: 04.07.06 15:20
Оценка: 3 (1)
DIS>Regex comment = new Regex(@"/\*.*\*/", RegexOptions.IgnoreCase | RegexOptions.Singleline);
DIS>все комментарии свалились в 1 совпадения

Всё правильно. Не забывайте, что регэкспы — жадные т.е. "*" бежала по совпадениям до тех пор, пока не упёрлась в последнюю "*/". Для таких случаев надо юзать ограничитель — "?":

/\*.*?\*/
Re[4]: Regex pattern для русских комментариев в исходниках C
От: -DIS-  
Дата: 11.07.06 10:38
Оценка:
Здравствуйте, 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 русскоязычных комментов моей тестовой папки сорцов. Как можно описать тело русскоязычного коммента?
Regex pattern для русских комментариев в исходниках C/C++/C#
От: Аноним  
Дата: 11.07.06 12:36
Оценка:
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
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.