我列出了我在coldfusion中创建的内容。让我们使用以下列表作为示例:
<cfset arguments.tags = "battlefieldx, testx, wonderful, ererex">
我想要做的是从末尾有x的单词中删除“x”,并将单词保留在列表中。订单无关紧要。一个正则表达式可以正常或循环使用coldfusion也可以。
答案 0 :(得分:5)
从每个列表元素的末尾删除x
...
要删除逗号前面的所有x
个字符或字符串的结尾,请执行以下操作:
rereplace( arguments.tags , "x(?=,|$)" , "" , "all" )
这里的(?= )
部分是一个先行 - 它匹配其内容的位置,但不包括在被替换的内容中。 |
是替换 - 它会尝试匹配文字,
,如果失败,它会尝试匹配字符串的结尾($
)。
如果您不想删除单独的x,例如“×,标记,所述,斑点” ... 强>
如果你想确保x在一个单词的末尾(即并不孤单),你可以使用非单词边界检查:
rereplace( arguments.tags , "\Bx(?=,|$)" , "" , "all" )
如果\B
之前没有[a-zA-Z0-9_]
,则x
将无法匹配 - 对于构成“单词结尾”的更复杂/准确的规则,您需要一个外观,这是无法通过重新放置来完成的,但通过这样做仍然很容易:
arguments.tags.replaceAll("(?<=\S)x(?=,|$)" , "" )
(在x之前查找单个非空格字符,将其视为单词的一部分,但您可以在lookbehind中放置任何有限宽度的表达式。)
显然,要做任何字母,请将x
与[a-zA-Z]
或任何合适的内容切换。
答案 1 :(得分:2)
从一个单词的结尾抓取'x'
的正则表达式非常简单。假设您将给定元素作为字符串,您需要的正则表达式就是:
REReplace(myString, "x$", "")
这匹配给定字符串末尾的x,并用空字符串替换它。
要对逗号分隔列表中的每个子字符串执行此操作,请尝试:
REReplace(myString, "x,|x$", ",", "ALL")
答案 2 :(得分:1)
REReplace(myString, "x$", "")
$
符号将用于检测字符串的结尾。从而检测到字符串末尾的'x'
。空引号将替换为空,因此删除'x'
。
答案 3 :(得分:0)
这已经得到了回答,但我想我会发布一个只有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>