正则表达式删除列表中每个单词的最后一个字母

时间:2013-05-03 21:41:30

标签: regex coldfusion

我列出了我在coldfusion中创建的内容。让我们使用以下列表作为示例:

<cfset arguments.tags = "battlefieldx, testx, wonderful, ererex">

我想要做的是从末尾有x的单词中删除“x”,并将单词保留在列表中。订单无关紧要。一个正则表达式可以正常或循环使用coldfusion也可以。

4 个答案:

答案 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>