速度 - 正确的正则表达式删除控制字符?

时间:2011-11-24 10:38:51

标签: java regex ascii velocity

我正在尝试从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 个答案:

答案 0 :(得分: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来满足您的所有逃避需求。

答案 1 :(得分:3)

那些Velocity Parser Exceptions可能来自 双引号 字符。 在尝试使用捕获组的String.replaceAll正则表达式时,我在VTL中遇到了类似的问题,如下所示:

  

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

抛出:

  

org.apache.velocity.exception.ParseErrorException:词法错误:org.apache.velocity.runtime.parser.TokenMgrError:第2行第58列的词汇错误。遇到:&#34; d&#34; (100),之后:&#34; \&#34; (CT - \&#34;

将其更改为单引号

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