Ответ 1
Здесь a.NET приправленный Regex для частичного разбора .Net шаблонов вкуса, который должен быть довольно близок:
\A
(?>
\\. # Capture an escaped character
| # OR
\[\^? # a character class
(?:\\.|[^\]])* # which may also contain escaped characters
\]
| # OR
\(\?(?# inline comment!)\#
(?<Comment>[^)]*)
\)
| # OR
\#(?<Comment>.*$) # a common comment!
| # OR
[^\[\\#] # capture any regular character - not # or [
)*
\z
К счастью, в .Net каждая группа захвата запоминает все свои захваты, а не только последние, поэтому мы можем найти все захваты группы Comment
в одном анализе. Регулярное выражение в значительной степени анализирует регулярное выражение - но вряд ли полностью, оно просто анализирует достаточно, чтобы найти комментарии.
Вот как вы используете результат:
Match parsed = Regex.Match(pattern, pattern,
RegexOptions.IgnorePatternWhitespace |
RegexOptions.Multiline);
if (parsed.Success)
{
foreach (Capture capture in parsed.Groups["Comment"].Captures)
{
Console.WriteLine(capture.Value);
}
}
Рабочий пример: http://ideone.com/YP3yt
Последнее слово предостережения - это регулярное выражение предполагает, что весь шаблон находится в режиме IgnorePatternWhitespace
. Когда он не установлен, все #
сопоставляются буквально. Имейте в виду, что флаг может меняться несколько раз в одном шаблоне. В (?-x)#(?x)#comment
, например, независимо от IgnorePatternWhitespace
, первый #
сопоставляется буквально, (?x)
снова включает флаг IgnorePatternWhitespace
, а второй #
игнорируется.
Если вы хотите надежное решение, вы можете использовать парсер языка regex.
Вероятно, вы можете адаптировать исходный код .Net и извлечь парсер: