AvalonEdit: Regex, захватывающий группы в XSHD-файле - PullRequest
1 голос
/ 14 декабря 2011

Я пытаюсь реализовать подсветку синтаксиса для Heredoc-подобного синтаксиса.поэтому я должен захватить начальное имя.но я потерпел неудачу (пробуя это в правиле и промежутке).Это мое регулярное выражение:

(?:([A-Z]{3,}))(.|\n)*?\1

Регулярное выражение работает в тестере регулярных выражений.

Но если я добавлю его в определение XSHD, я получу ошибку:

Error at line 128:
"(?:([A-Z]{3,}))(.|\n)*?\1" wird analysiert - Verweis auf die nicht definierte Gruppenzahl 1.

он говорит, что номер группы 1 не определен.

кто-нибудь знает причину?и как реализовать сопоставление?

спасибо

Ответы [ 3 ]

2 голосов
/ 15 декабря 2011

AvalonEdit использует RegexOptions.ExplicitCapture, поэтому вам придется использовать именованные группы захвата.

Однако то, что вы пытаетесь сделать, невозможно в AvalonEdit. Правила не могут быть многострочными, и конец диапазона не может использовать обратные ссылки для начала диапазона.

Это связано с тем, что подсвечивающий механизм подсвечивает каждую строку по отдельности и только повторно подсвечивает измененные строки, когда пользователь редактирует текст. Для поддержки конструкций HEREDOC AvalonEdit должен будет хранить результаты именованных групп захвата как часть стеков диапазонов и должен поддерживать некоторый специальный синтаксис, чтобы регулярное выражение конца диапазона могло использовать обратные ссылки на эти сохраненные результаты.

1 голос
/ 14 декабря 2011
"(?:([A-Z]{3,}))(.|\n)*?\1"

Хм, первая скобка (?:) - это группа без захвата, когда вы хотите сгруппировать (скажем, для оператора |), но вам все равно, чтобы «запомнить» это. Вторая скобка, то, что вы хотите быть группой № 1, находится внутри этой: ([A-Z]{3,}). Казалось бы логичным, что, говоря «не помни, что внутри», это не будет.

В любом случае, какой смысл удваивать группы, когда внешнее существо не захватывает? (также не нужно использовать запятую, если вы не указали вторую часть последовательности квантификатора) Разве вы не можете просто сказать:

"([A-Z]{3})[.\n]*?\1"   //now \1 is defined?

что касается вашей ТРЕТЬЕЙ группы, (.|\n)*?, в которой вы использовали группировку + чередование + квантификаторы одновременно, я понятия не имею, что может быть \ 3, если вы попытались получить к нему доступ в исходном выражении: [.\n]*? должно быть в порядке.

0 голосов
/ 14 декабря 2011

*?

повторяет обратную ссылку itseft.

как насчет

(?: ([AZ] {3,})) [. \ N] *? \ 1

...