2011-11-24 3 views
2

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) 

내가 시도한 몇 가지 정규식의 (많은 VTL 자바에서 제대로 작동하지만,하지)? 내 주요 문제는 자바와 벨로 시티 간의 도주가 어떻게 다른 것 같습니까?

아무도 도와 줄 수 있습니까? Java 클래스가 아닌 VTL에만 액세스 할 수 있습니다.

답변

3

실제 정규 표현식에 대해서는 언급 할 수 없습니다. 그러나 속도 측면에서

, 나는
#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을 사용할 수 있습니다.

+0

나는 이것이 오래된 게시물이라는 것을 알고 있는데, "VTL shell"은 무엇을 사용 했습니까? 나는 좋은 것을 찾고 있어요 – jbnunn

+0

저는 파일 변경시에 그냥 반복하는 것을 사용했습니다. 아주 간단합니다. 그래도 '적절한'REPL과 '공식적인'REPL은 괜찮을 것입니다. – alvi

+0

VTL 셸 설정 방법을 공유 할 수 있습니까? 매우 유용 할 것입니다 :). –

3

그 속도 파서 예외는 따옴표 자까지 올 수 있습니다. 과 같이, 캡처 그룹과 정규 표현식을 String.replaceAll 할 때 내가 VTL에서 비슷한 문제가 있었다 :

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

예외 :

org.apache.velocity.exception.ParseErrorException: Lexical error: org.apache.velocity.runtime.parser.TokenMgrError: Lexical error at line 2, column 58. Encountered: "d" (100), after : "\" (CT-\"

작은 따옴표로 변경이을했다 :

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