Следующие команды 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