Velocity - Исправить регулярное выражение для удаления управляющих символов? - PullRequest
2 голосов
/ 24 ноября 2011

Я пытаюсь удалить нежелательные символы из строки в Velocity (переводы строки в порядке, но не такие вещи, как управляющие символы EM и CAN ASCII).

#set($cleanScreen = $cleanScreen.replaceAll("\p{Cc}", ""))

Выдает:

org.apache.velocity.exception.ParseErrorException: Lexical error: org.apache.velocity.runtime.parser.TokenMgrError: Lexical error at line 13, column 82.  Encountered: "p" (112), after : "\"\\"
    at org.apache.velocity.Template.process(Template.java:137)
    at org.apache.velocity.runtime.resource.ResourceManagerImpl.loadResource(ResourceManagerImpl.java:415)
    at org.apache.velocity.runtime.resource.ResourceManagerImpl.getResource(ResourceManagerImpl.java:335)
    at org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1102)
    at org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1077)
    at org.apache.velocity.runtime.RuntimeSingleton.getTemplate(RuntimeSingleton.java:303)
    at org.apache.velocity.app.Velocity.getTemplate(Velocity.java:503)

и

#set($cleanScreen = $cleanScreen.replaceAll("[[:cntrl:]]", ""))

Это не выдает исключение, вместо этого оно соответствует символам c,n,t,r,l и удаляет их из строки.

и ...

#set($cleanScreen = $cleanScreen.replaceAll("\\p{Cntrl}", ""))

Выдает:

java.util.regex.PatternSyntaxException: Illegal repetition near index 2
\\p{Cntrl}
  ^
    at java.util.regex.Pattern.error(Unknown Source)
    at java.util.regex.Pattern.closure(Unknown Source)
    at java.util.regex.Pattern.sequence(Unknown Source)
    at java.util.regex.Pattern.expr(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.util.regex.Pattern.<init>(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.lang.String.replaceAll(Unknown Source)
    at sun.reflect.GeneratedMethodAccessor168.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.invoke(UberspectImpl.java:295)
    at org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:245)

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

Может кто-нибудь помочь? У меня есть доступ только к VTL, а не к классу Java.

Ответы [ 2 ]

3 голосов
/ 29 октября 2013

Исключения Velocity Parser могут быть взяты из двойных кавычек символов. У меня была похожая проблема в VTL при попытке регулярного выражения String.replaceAll с группой захвата, например так:

# set ($ Jira_links = $ Jira_tickets.replaceAll ("(CT- \ d +)", "http://jira.site.com/browse/$1"))

Выдает:

org.apache.velocity.exception.ParseErrorException: Лексическая ошибка: org.apache.velocity.runtime.parser.TokenMgrError: Лексическая ошибка в строке 2, столбец 58. Обнаружено: «d» (100), после: «\ "(CT - \"

Изменение его в сработали одинарные кавычки :

#set( $Jira_links = $Jira_tickets.replaceAll('(CT-\d+)', 'http://jira.site.com/browse/$1') )
3 голосов
/ 24 ноября 2011

Я не могу комментировать фактическое регулярное выражение.

Однако со стороны скорости я нахожу, что ...

#set($cleanScreen = $cleanScreen.replaceAll("\p{Cc}", ""))
#set($cleanScreen = $cleanScreen.replaceAll("[[:cntrl:]]", ""))

... эти два верны, как они есть,У меня есть небольшая оболочка vtl, в которую я просто копирую вставленный код vtl.Вы действительно получаете эти ошибки с первыми двумя выражениями?Как насчет использования «\ p {Cc}»?

#set($cleanScreen = $cleanScreen.replaceAll("\\p{Cntrl}", ""))

«\\ p» доставит вам неприятности.

В примечании вы можете использовать http://velocity.apache.org/tools/devel/generic/EscapeTool.html для всех ваших побега потребностей.

...