2011-05-23 75 views
1

我刚开始使用速度进行新工作,我真的不喜欢我已经找到的东西。在这一点上,我实际上更喜欢freemarker = X。 不管怎么说,我试图做一个正则表达式,我看到this little bit (search "regular expression"),但那不是我正在做的实现。速度模板 - 正则表达式

我没有任何访问的Java,所以选择写东西自定义做这个东西不存在(我甚至不知道如果这是可能的)。

这就是我现在所拥有的:

#set ($envCheck = "(localhost|staging|qa|cms)\\.site") 
#set ($envCheck = $envCheck.matches($gatewayURL)) 

$envCheck始终只是出来的“假”。 $gatewayURL也在页面上定义,所以这不是问题。

这甚至有可能吗?我读到的是,在速度模板中可以使用java String类具有的任何正则表达式方法。

回答

3

假设你$gatewayURL是somethign这样的:

#set ($gatewayURL = "localhost.site") 

然后:

#set ($envCheck = "(localhost|staging|qa|cms)\.site") 
#set ($envCheck = $gatewayURL.matches($envCheck)) 

没有必要掩盖反斜线,你应该叫matches()gatewayURL,而不是正则表达式。

Velocity没有自己的regexp实现,只是将你提供的参数传递给相应的本地java方法,就这些。所以你可以使用几乎完整的Java SDK。

+0

这是为特定版本的速度?我们在这里运行1.4(一堆遗留的垃圾...)我似乎无法让你的正则表达式版本工作。 也写了我的初始评论后,我确实发现该对象有权访问java方法,具体取决于对象类型 – hellatan 2011-05-24 21:03:24

+0

@dtan对不起,我不确定1.4是否太旧。自那时以来发生了一些剧烈的变化...... – serg 2011-05-24 21:14:23

+0

这是非常通用的速度。它应该在1.4中工作。但是,当然,JDK必须至少为1.4。 (或者你正在进行的方法调用的相关版本)。 – 2011-06-12 20:46:55

2

这个答案很晚,但作为Velocity用户遇到同样问题的参考可能仍然很好。

我们使用Velocity 1.5(太大的任务,升级到1.7/1.6,因为他们打破了太多的模板),并遇到同样的问题。上面的答案是行不通的 - 没有转义(\)的后退导致词法错误和转义(\\)总是返回false,因为我认为它正在被逐字解释。解决这个问题的正确方法是在定义regex表达式时使用单引号而不是双引号,因此Velocity不会尝试解释用于Java的字符串。

#set ($envCheck = '(localhost|staging|qa|cms)\.site') 
#set ($envCheck = $envCheck.matches($gatewayURL)) 
+0

lolz。必须爱单双引号技巧:)。如果我仍然以速度工作(感谢上帝,我不),我会尽力给你答案,但我无法验证任何东西。 – hellatan 2016-03-22 14:30:07

+0

没问题。经过几年幸存的JSP,Velocity并没有那么糟糕...... :-) – dancnfoo 2016-03-24 20:52:27