2014-01-30 2 views
4

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

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

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

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

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

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

Заранее благодарен!

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

+0

Я не знаю 'saxon', но в какой-то регулярное выражение вкуса вы можете просто использовать' \ pZ' без скобок. Вы могли бы попробовать. – Toto

ответ

6

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

шаблон значение

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

Примечание:

выражение в переменной части может содержать неэкранированный фигурная кронштейн внутри СтроковогоЛитерала XP или в пределах комментария.

Не все атрибуты AVTS, но the regex attribute of analyze-string is:

Примечание:

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

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

+0

@OP: P.S. Что касается утверждения RegexBuddy: когда вы используете 'regex =" \ p {{Z}} "', вы поставляете regexp '\ p {Z}' (с соответствующим экранированием). Если вы дадите RegexBuddy такое же регулярное выражение '\ p {Z}', оно одобряет. Поэтому RegexBuddy соглашается с XSLT об этом регулярном выражении. – LarsH

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