我列出了我在 Coldfusion 中创建的内容。让我们以以下列表为例:
<cfset arguments.tags = "battlefieldx, testx, wonderful, ererex">
我想做的是从末尾有 x 的单词中删除“x”,并将这些单词保留在列表中。顺序无所谓。一个正则表达式就可以了,或者用coldfusion循环也可以。
我列出了我在 Coldfusion 中创建的内容。让我们以以下列表为例:
<cfset arguments.tags = "battlefieldx, testx, wonderful, ererex">
我想做的是从末尾有 x 的单词中删除“x”,并将这些单词保留在列表中。顺序无所谓。一个正则表达式就可以了,或者用coldfusion循环也可以。
x
从每个列表元素的末尾删除...
要删除x
逗号或字符串结尾的所有字符,请执行以下操作:
rereplace( arguments.tags , "x(?=,|$)" , "" , "all" )
这里的(?= )
部分是一个前瞻 - 它匹配其内容的位置,但不包括在被替换的内容中。|
is 交替 - 它会尝试匹配文字,
,如果失败,它将尝试匹配字符串的结尾 ( ) $
。
如果您不想从例如“x,marks,the,spot”中删除一个单独的 x...
如果要确保 x 在单词的末尾(即不是单独的),可以使用非单词边界检查:
rereplace( arguments.tags , "\Bx(?=,|$)" , "" , "all" )
如果之前没有,\B
则将不匹配- 对于关于什么构成“单词结尾”的更复杂/准确的规则,你需要一个lookbehind,这不能用replace来完成,但仍然很容易通过正在做:[a-zA-Z0-9_]
x
arguments.tags.replaceAll("(?<=\S)x(?=,|$)" , "" )
(这会在 x 之前查找单个非空白字符以将其视为单词的一部分,但您可以将任何有限宽度的表达式放在后面。)
显然,要写任何字母,请切换x
with[a-zA-Z]
或任何合适的。
'x'
从词尾抓取的正则表达式非常简单。假设您有一个给定的元素作为字符串,您需要的正则表达式很简单:
REReplace(myString, "x$", "")
这匹配给定字符串末尾的 x 并将其替换为空字符串。
要对逗号分隔列表中的每个子字符串执行此操作,请尝试:
REReplace(myString, "x,|x$", ",", "ALL")
REReplace(myString, "x$", "")
该$
符号将用于检测字符串的结尾。从而检测'x'
字符串末尾的 a 。空引号将用任何内容替换它,从而删除'x'
.
这已经得到了回答,但是我想我会发布一个 ColdFusion 唯一的解决方案,因为你说你可以使用任何一个。(RegEx 显然要容易得多,但这也可以)
<cfset arguments.tags = "battlefieldx, testx, wonderful, ererex">
<cfset temparray = []>
<cfloop list="#arguments.tags#" index="i">
<cfif right(i,1) EQ 'X'>
<cfset arrayappend(temparray,left(i,len(i) - 1))>
<cfelse>
<cfset arrayappend(temparray,i)>
</cfif>
</cfloop>
<cfset arguments.tags = arraytolist(temparray)>
如果您有 ColdFusion 9+ 或 Railo,您可以使用三元运算符简化循环
<cfloop list="#arguments.tags#" index="i">
<cfset cfif right(i,1) EQ 'X' ? arrayappend(temparray,left(i,len(i) - 1)) : arrayappend(temparray,i)>
</cfloop>
您也可以转换arguments.tags
为数组并以这种方式循环
<cfloop array="#listtoarray(arguments.tags)#" index="i">
<cfset cfif right(i,1) EQ 'X' ? arrayappend(temparray,left(i,len(i) - 1)) : arrayappend(temparray,i)>
</cfloop>