Зачем мне использовать двойные фигурные скобки в моем RegEx?

Я выполняю небольшое регулярное выражение в одном из моих xsl-преобразований (xsl:analyze-string) и наткнулся на этот эффект, который сделал меня довольно неудобным, потому что я действительно не нашел никаких объяснений...

Я искал Non-Breaking-Spaces и En-Spaces, поэтому я использовал конструкцию \p{Z}. Согласно многим примерам в справочнике программистов XSLT 2.0 Майклом Кей, это должно сработать. RegExBuddy также утверждает:)

Теперь мой SaxonHE9.4N говорит мне

Ошибка в регулярном выражении: net.sf.saxon.trans.XPathException: expected ({)

После нескольких испытаний и ошибок я просто удвоил скобки \p{{Z}}... и это сработало!? Но на этот раз RegExBuddy не одобряет!

Может кто-нибудь дать мне объяснение этого эффекта? Я не мог найти ничего приятного в Интернете...

Спасибо заранее!

Изменить: Я пробовал одно и то же внутри функции replace(), а версия с двумя скобками не работала. Я должен был сделать это с помощью отдельных скобок!

1 ответ

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

Шаблон значения атрибута состоит из чередующейся последовательности неподвижные детали и переменные детали. Переменная часть состоит из XPath выражение, заключенное в фигурные скобки ({}). Фиксированная часть может содержать любые символы, за исключением того, что левая фигурная скобка должна быть записана как {{ и правая фигурная скобка должна быть записана как}}.

Примечание:

     

Выражение внутри переменной части может содержать неэкранированную фигуру   скобки внутри StringLiteral XP или в комментарии.

Не все атрибуты AVT, но атрибут regex для строки анализа:

Примечание:

Поскольку атрибут regex является шаблоном значения атрибута, фигурные скобки внутри регулярного выражения должны быть удвоены. Например, для соответствия последовательности от одного до пяти символов, напишите regex = ". {{1,5}}". Для регулярных выражений, содержащих множество фигурных скобок, это может быть больше удобно использовать обозначение, такое как regex = "{'[0-9] {1,5} [a-z] {3} [0-9] {1,2}'}" или использовать переменную.

(Акцент добавлен в обоих кавычках.)

licensed under cc by-sa 3.0 with attribution.