Экранирование угловой скобки XML в регулярном выражении

Я использовал элемент управления ICSharp TextEditor, и он использует файл XML для разработки различных разделов подсветки синтаксиса (строки, комментарии и т. д.) с помощью механизма регулярных выражений С#.

Итак, я использовал это регулярное выражение для сопоставления символов аккорда (из этого вопроса):

\b[A-G](?:add|maj|j|m|\+|b|\#|sus|\d|°)*(?:\b|(?<=\#))

Проблема в том, что символ ‹ является частью синтаксиса XML, поэтому я заменил его на <, сделав так:

\b[A-G](?:add|maj|j|m|\+|b|\#|sus|\d|°)*(?:\b|(?&lt=\#))

Проблема в том, что после этого программа вылетает из-за недопустимого регулярного выражения. Я сузил его, и проблема определенно связана с <.

Итак, есть ли другой способ избежать угловой скобки ‹, при этом позволяя механизму регулярных выражений использовать его.


person Migwell    schedule 05.02.2011    source источник
comment
Вы наверняка знаете его (с точкой с запятой в конце), а не просто <   -  person anroesti    schedule 05.02.2011


Ответы (2)


Объект XML для < — это &lt;, а не &lt.

person Mark Byers    schedule 05.02.2011
comment
Почему вы изменили свой первоначальный ответ, я думаю, что вопрос о (? против (?: был полезен. - person anroesti; 05.02.2011
comment
Извините, просто я использовал бета-версию Firefox и не мог добавлять теги кода. Я исправил это позже, поэтому ваш последний ответ не имел значения. Хотя за это спасибо. - person Migwell; 05.02.2011

В первом регулярном выражении токен (?<=\#) является «позитивным просмотром назад», говорящим, что в этот момент совпадения вы хотите оглянуться назад и увидеть буквальный символ фунта (который был экранирован, но не должен быть, # is не является метасимволом регулярного выражения).

Если вместо этого вы намеревались создать группу без захвата, вам нужно было (?: *pattern* ), то есть: (?:‹=#). Насколько мне известно, «меньше», «равно» и «фунт» — это обычные символы в регулярном выражении, и их не нужно экранировать.

person Scott Weaver    schedule 15.12.2011