Генерация списка ярлыков (обозначается надписями к кнопкам, содержащим символ &) из файлов ресурсов - PullRequest
0 голосов
/ 24 января 2012

У меня есть список из 429 файлов ресурсов MFC, для которых мне нужно сгенерировать список ярлыков, которые будут кнопками, содержащими символ амперсанда (например, КНОПКА «& Закрыть»), указывающими, что ALT-C является ярлыком для закрытия этого конкретного диалог.

Проблема в том, что файлы ресурсов содержат много разных диалогов, отформатированных так:

IDD_VIDEO DIALOG  0, 0, 471, 187
...
BEGIN
    ...
    PUSHBUTTON      "&Close",IDC_CLOSE,89,166,53,14
    ...
END

Форматом, который я хотел бы вытащить, был бы список «& Закрыть» (или, в идеале, «ALT-C & Закрыть») и другие метки с ярлыками, разделенными по тому диалогу, в котором они находятся (например, IDD_VIDEO). Регулярное выражение кажется лучшим решением, но я пока не смог найти работающего регулярного выражения.

1 Ответ

1 голос
/ 24 января 2012

Спасибо за добавленные характеристики. Это должно работать:

^                  # Start of line
(IDD_\w+)          # Alphanumeric identifier, starting with IDD_
\s+DIALOG\b        # followed by "DIALOG"
((?:(?!^END\b).)*) # and any number of characters unless there's an END in-between

Это будет соответствовать всему разделу от IDD_whatever до следующего END. Затем вам нужно взять эту строку и применить к ней следующее регулярное выражение:

"([^"]*&[^"]*)"  # String containing at least one &

Вот пример C #:

Regex sectionRegex = new Regex(
    @"^                 # Start of line
    (IDD_\w+)           # Alphanumeric identifier, starting with IDD_
    \s+DIALOG\b         # followed by ""DIALOG""
    ((?:(?!^END\b).)*)  # and any number of characters unless there's an END in-between",
    RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace);

Regex altCRegex = new Regex(
    @"""([^""]*&[^""]*)"" # String containing at least one &", 
    RegexOptions.IgnorePatternWhitespace);

Match matchResults = sectionRegex.Match(subjectString);
while (matchResults.Success) {
    identifier = matchResults.Groups[1].Value;
    section = matchResults.Groups[2].Value;
    Match sectionResults = altCRegex.Match(section);
    while (sectionResults.Success) {
        altCString = sectionResult.Groups[1].Value;
        sectionResults = sectionResults.NextMatch();
    }
    matchResults = matchResults.NextMatch();
} 

Конечно, этот фрагмент кода ничего не делает с identifier и altCString, но я думаю, вы поняли.

...