ColdFusion正则表达式将某些内容包含在分类范围内

时间:2014-04-20 12:55:23

标签: regex coldfusion

我正在努力实现看似不太复杂的任务,到目前为止没有任何结果。

这是一个示例字符串:

<cfset myString = "cm: first_part; fn: second_part; There was a farmer who had a dog">

所需的输出应为:

"cm: <span class='highlight'>first_part</span>; fn: <span class='highlight'>second_part</span>; There was a farmer who had a dog"

怎么会这样呢?注释/限制是它必须在ColdFusion 10中完成(我怀疑使用Regex)。

到目前为止,我到目前为止所得到的是:

<cfoutput>#ReReplace(myString,"(cm:)?:(.*?);","<span class='highlight'>"&REMatch("(cm:)?:(.*?);",myString)[1]&"</span>","one")#</cfoutput>

这当然只会改变cm和以下';'

之间的第一部分

谢谢!

2 个答案:

答案 0 :(得分:4)

根据上述问题的回答,将^(cm: )(.*)(; fn: )(.*)(; .*?)$替换为\1<span class='highlight'>\2</span>\3<span class='highlight'>\4</span>\5可能会有效。

这不会正确处理second_part中的分号。

答案 1 :(得分:2)

您可以使用以下单个表达式执行这两个部分:

rereplace
    ( myString
    , "(cm: |fn: )([^;]*)(?=;)"
    , "\1<span class='highlight'>\2</span>"
    , "all"
    )


使用Java的replaceAll方法可以略微简化,其中lookbehind可用于避免捕获组的需要:

myString.replaceAll
    ( "(?<=cm: |fn: )[^;]*(?=;)"
    , "<span class='highlight'>$0</span>"
    )


是否像这样单独匹配比作为整个文本的一部分匹配更好(根据Adam的答案)将取决于用例 - 即样本字符串对实际输入的代表性,以及如果碰巧发生的话预期会发生什么是多个cm / fn部分。