2011-11-24 48 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) 

我試過幾個正則表達式的(許多人似乎在Java中工作,但沒有VTL)?我的關鍵問題似乎是Java和Velocity之間的轉義有什麼不同?

任何人都可以幫忙嗎?我只能訪問VTL,而不是Java類。

回答

3

我無法評論實際的正則表達式。

上。但是在速度方面,我發現......

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

...這兩個是因爲它們是正確的。我有一個vtl shell,我剛剛複製粘貼你的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。 – alvi

+0

你能分享一下你如何設置一個VTL外殼?有這個:)會非常有用。 –

3

那些Velocity Parser異常,可能來自雙引號字符。 我當試圖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'))