【问题标题】:Iterate through a string in velocity以速度遍历字符串
【发布时间】:2012-12-06 02:52:45
【问题描述】:

乍一看,我面临着一项相当微不足道的任务,但在一天之内,我并没有以某种方式取得进展。我需要在速度模板中处理一个字符串。 字符串有这样的视图:

    Maj - [at552] - asdfghjkksfgh <br /> Avg - [at553] - asdfghjkksfgh <br /> etc

我需要将 [ ] 符号中的文字替换为以下文字:

    <a href="http://someaddress/at522">at522</a> (at522 is specific for 
    each [ ] block)

我尝试了很多方法,但都没有奏效,所以我什至不知道我可以在这里发布什么 sn-ps 代码。一个重要的细节是我无法访问应用程序的 java 部分,只能访问传入速度模板的对象。我不能使用 JavaScript,因为这是一个电子邮件模板。我真的很感激每一个建议。

更新 这是第一次出现 [ ]

时可以正常工作的代码
#set ($scopeComment = $issue.getCustomFieldValue("customfield_10201").replaceAll("\n", "<br />"))
#set ($start = $scopeComment.indexOf("["))
#set ($end = $scopeComment.indexOf("]"))
#set ($substr = $scopeComment.substring($start, $end))
#set ($scopeComment = $scopeComment.replace($substr, "<a href=\"localhost/$substr\">$substr</a>"))

但我不能让它在所有 [ ] 块的循环中工作 这是我正在尝试的一种方法

#foreach ($index in [0..$scopeComment.length()])
    #set($nextIndex = $index.index+1)
    #set($curChar = $scopeComment.substring($index.index, $nextIndex))
    #if ($curChar.equals("["))
        #set ($start = $count+1)
        #set ($end = $scopeComment.indexOf("]", count))
        #set ($sub = $scopeComment.substring($start, $end))
        $sub <br/>
    #end
#end

【问题讨论】:

    标签: java string iterator velocity


    【解决方案1】:

    RegExp 在这种情况下可以工作:

    #set ($var = $var.replaceAll('\[([a-z0-9]*)\]', '<a href="http://someaddress/$1">$1</a>'))
    

    请注意,我使用了引号和单反斜杠。与 Java 不同,Velocity 在使用双引号或单引号时表现不同。

    您的代码中有很多错误。例如,$index.index 应该是什么? $index 是一个整数,所以你应该在你的检查中使用 $index。此外,您使用$count,但没有在任何地方定义,您的意思可能也是$index

    【讨论】:

    • 非常感谢。我尝试了很多语法组合,但没有尝试单引号。现在可以使用了!
    【解决方案2】:

    尝试正则表达式:

    #set($var= $var.replaceAll("\\[([a-z0-9]*)\\]", "<a href="http://someaddress/$1">$1</a>"))
    

    Working regexp example

    【讨论】:

    • 当我在普通的 java 类中尝试它时,这非常有效,但在速度模板中它无法匹配符号 []。仍在研究问题
    猜你喜欢
    • 2018-05-15
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    相关资源
    最近更新 更多