1

我列出了我在 Coldfusion 中创建的内容。让我们以以下列表为例:

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

我想做的是从末尾有 x 的单词中删除“x”,并将这些单词保留在列表中。顺序无所谓。一个正则表达式就可以了,或者用coldfusion循环也可以。

4

4 回答 4

5

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 之前查找单个非空白字符以将其视为单词的一部分,但您可以将任何有限宽度的表达式放在后面。)

显然,要写任何字母,请切换xwith[a-zA-Z]或任何合适的。

于 2013-05-03T21:51:02.720 回答
2

'x'从词尾抓取的正则表达式非常简单。假设您有一个给定的元素作为字符串,您需要的正则表达式很简单:

REReplace(myString, "x$", "")

这匹配给定字符串末尾的 x 并将其替换为空字符串。

要对逗号分隔列表中的每个子字符串执行此操作,请尝试:

REReplace(myString, "x,|x$", ",", "ALL")
于 2013-05-03T21:46:34.563 回答
1
REReplace(myString, "x$", "")

$符号将用于检测字符串的结尾。从而检测'x'字符串末尾的 a 。空引号将用任何内容替换它,从而删除'x'.

于 2013-05-03T21:50:51.900 回答
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>
于 2013-05-03T22:24:56.143 回答