2011-02-04 4 views
5

Я пытаюсь сопоставить контрольный символ в форме \^c, где c - любой допустимый символ для управляющих символов. У меня есть это регулярное выражение, но оно в настоящее время не работает: \\[^][@-z]Что такое регулярное выражение для управляющих символов?

Я думаю, что проблема заключается в том, что символ каретки (^) является частью механизма синтаксического анализа регулярных выражений.

+0

Это не имеет для меня никакого смысла. Есть ли обратная косая черта? Являются ли эти реальные управляющие символы или какая-то последовательность ASCII подразумевает то же самое? Зачем идти \ c @ .. \ cZ? Знаете, есть и другие. – tchrist

+0

Почему вы все равно помещаете каретку в класс символов? –

+0

Я пытаюсь сопоставить буквальный текст для управляющих символов, а не самих символов управления. –

ответ

7

Соответствует текстовой строке ASCII формы ^X с использованием рисунка \^., ничего более. Сопоставьте текстовую строку ASCII формы \^X с рисунком \\\^.. Вы можете ограничить эту точку до [[email protected]_\[\]^\\], поэтому \\\^[[email protected]_\[\]^\\]. Легче читать как [?\x40-\x5F] для класса символов в квадратных скобках, поэтому \\\^[?\x40-\x5F] для буквального BACKSLASH, за которым следует буквальный CIRCUMFLEX, за которым следует что-то, что превращается в один из допустимых управляющих символов.

Обратите внимание, что это результат печати шаблона или того, что вы читали из файла. Это то, что вам нужно передать компилятору регулярных выражений. Если у вас есть строковый литерал, вы должны, конечно, удвоить каждую из этих обратных косых черт. `\\\\\\^[?\\x40-\\x5F]" Да, это безумный взгляд, но это потому, что Java не поддерживает регулярные выражения напрямую, как Groovy и Scala - или Perl и Ruby - do. Работа с регулярными выражениями всегда проще без дополнительных bbaacckksslllllaasshheesssssess. :)

Если у вас были реальные контрольные символы, а не косвенные их представления, вы бы использовали \pC для всех буквенных кодовых точек с свойством GC = Other или \p{Cc} для просто GC = Control.

+0

Я не совсем уверен, что понимаю \ pC. Я пишу лексический анализатор, используя JLex, и мне нужно распознать правильные последовательности символов управления в строке и перевести их в их эквиваленты ASCII. Например, строка «\^g» будет печатать символ колокола или вызывать звуковой сигнал компьютера. Мне нужно регулярное выражение для соответствия управляющим символьным последовательностям типа «\^g». –

+0

@pcman: У вас есть буквальный BACKSLASH, за которым следует буквальный CIRCUMFLEX, за которым следует символ, который является одним из '[A-Z @? \ [\] _ ^]'? – tchrist

+0

Да, я пытаюсь сопоставить буквальный текст, поскольку он появится в строке. –

2

Проверьте это: http://www.regular-expressions.info/characters.html. Вы должны использовать \ cA для \ cZ, чтобы найти управляющие символы.

+1

Как насчет '\ c?' Для DELETE (U + 7F)? Знаете ли вы, что Java думает, что '\ c {' is ';' и что '\ c;' is '{'? Они забыли проверить, что результатом является '\ p {Cc}'. К сожалению! – tchrist

Смежные вопросы