Java 在apache velocity中使用预定义的字符类替换所有

Java 在apache velocity中使用预定义的字符类替换所有,java,regex,velocity,Java,Regex,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]+而不是预定义的类\W #set( $strin

Velocity在更换管柱时似乎遇到了一些问题:

#set( $stringOriginal = "some * oxdd --- strin+g here" )
#set( $stringAfter = $stringOriginal.replaceAll("\\W+","+") )
$stringAfter
而非单词部分,保持不变:它打印这个

some * oxdd --- strin+g here
但是如果我使用
[^a-zA-Z_0-9]+
而不是预定义的类
\W

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

some+oxdd+strin+g+here 
试图用奇数的
\
逃逸会抛出一个
词法错误: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上,确实转义解析看起来很奇怪“\\W”在java中表示
“\\\\W”
(即两个反斜杠),但velocity中的
“\W”
会导致解析错误

但是,在v1.5上,单引号在这里起作用

#set( $stringAfter = $stringOriginal.replaceAll('\W+',"+") )
我想知道如何用velocity表示
\n
等,但我的实验到此结束


虽然Velocity最初是一种“简单”的模板语言,但它添加了越来越多的功能来模仿“真实”的语言,语法开始失控:)

我没有使用
Velocity
,但是
\
是否可能不是字符串文字中的特殊字符?您能用
\W+
代替
\\W+
吗?如果是这样的话,那么解释就是
\\W+
将表示以
\
开头的文本,后面有一个或多个
W
。在发布之前,我尝试了
\W
\\W
\\\W
\\\W
。如果需要更多的时间,在这个世界上就没有什么好笑的了。使用调试器查看传递给replaceAll的内容?@loolo,我想
some+oxdd+strin+g+这里
;只需将非单词部分替换为
+
@loolou,我假设您指的是set指令内部;它抛出错误。我得到
词法错误:org.apache.velocity.runtime.parser.TokenMgrError:第2行第51列的词法错误。遇到:“W”(87),在“\”\\”
@user3276552之后-您使用的是最新版本吗?我使用的是aws cli。它与velocity-1.5和velocity-tools-1.4捆绑在一起(问题已更新)我下载了v1.7,它显然是在2010年发布的。v1.5是在2007年发布的。是的,这不是一个理想的情况。在这之前我没有接触过java;我的公司需要做一些amazon turk web界面不会做的事情。如果有更简单的选择,我会接受它。感谢您的帮助,很抱歉,这并不简单。