我正在努力实现看似不太复杂的任务,到目前为止没有任何结果。
这是一个示例字符串:
<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和以下';'
之间的第一部分谢谢!
答案 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部分。