Как избежать выхода из Юникода в Groovy / шаблон / синтаксис - PullRequest
2 голосов
/ 14 июля 2010

Следующие команды Groovy иллюстрируют мою проблему.

Прежде всего, это работает (, как видно на lotrepls.appspot.com ), как и ожидалось (обратите внимание, что \u0061 равно 'a').

>>> print "a".matches(/\u0061/)

true

Теперь предположим, что мы хотим сопоставить \n, используя escape-код Unicode \u000A.Следующее, используя "pattern" в качестве строки, ведет себя как ожидалось:

>>> print "\n".matches("\u000A");

Interpreter exception: com.google.lotrepls.shared.InterpreterException:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed,
Script1.groovy: 1: expecting anything but ''\n''; got it anyway
@ line 1, column 21. 1 error

Это ожидается, потому что, по крайней мере, в Java экранирование Unicode обрабатывается рано ( JLS 3.3 ), поэтому:

print "\n".matches("\u000A")

действительно совпадает с:

print "\n".matches("
")

Исправление состоит в том, чтобы избежать экранирования Unicode и позволить обработчику regex обработать его следующим образом:

>>> print "\n".matches("\\u000A")

true

Теперь вот часть вопроса: как мы можем заставить это работать с синтаксисом Groovy /pattern/ вместо использования строкового литерала?

Вот некоторые неудачные попытки:

>>> print "\n".matches(/\u000A/)

Interpreter exception: com.google.lotrepls.shared.InterpreterException:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed,
Script1.groovy: 1: expecting EOF, found '(' @ line 1, column 19.
1 error

>>> print "\n".matches(/\\u000A/)

false

>>> print "\\u000A".matches(/\\u000A/);

true

1 Ответ

0 голосов
/ 14 июля 2010

~ "[\ u0000- \ u0008 \ u000B \ u000C \ u000E- \ u001F \ u007F- \ u009F]"

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

...