replaceAll 在 apache velocity 中使用预定义字符 类

replaceAll using predefined character classes in apache velocity

Velocity 似乎在字符串替换方面遇到了一些问题:

#set( $stringOriginal = "some * oxdd --- strin+g here" )
#set( $stringAfter = $stringOriginal.replaceAll("\W+","+") )
$stringAfter

和非单词部分,保持不变:它打印这个

some * oxdd --- strin+g here

但是 如果我使用 [^a-zA-Z_0-9]+ 而不是预定义的 class \W

#set( $stringOriginal = "some * oxdd --- strin+g here" )
#set( $stringAfter = $stringOriginal.replaceAll("[^a-zA-Z_0-9]+","+") )
$stringAfter

一切都很好

some+oxdd+strin+g+here 

尝试以奇数 \ 逃脱会抛出
Lexical error: org.apache.velocity.runtime.parser.TokenMgrError:
让它看起来像 velocity 试图逃避它自己。

我正在使用 amazon-mturk cli,它附带 velocity-1.5velocity-tools-1.4.

单个 \ 适用于 velocity-1.7

#set( $stringAfter = $stringOriginal.replaceAll("\W+","+") )

在 velocity-1.5 上,确实转义解析似乎不合时宜。 velocity 中的 "\W" 表示 java 中的 "\\W" (即两个反斜杠),但是 velocity 中的 "\W" 会导致解析错误。

但是,单引号适用于 v1.5

#set( $stringAfter = $stringOriginal.replaceAll('\W+',"+") )

我想知道你如何用速度来表达 \n 等 -- 但我的实验到此为止。

虽然 Velocity 最初是一种 "simple" 模板语言,但它添加了越来越多的功能来模仿 "real" 语言,并且语法开始失控 :)