使用ColdFusion将最后一个逗号替换为“或”。

6

如何在ColdFusion中将一组值转换成最佳方式的数组

[ Fed Jones, John Smith, George King, Wilma Abby] 

并且将其转换为最后一个逗号为或的列表

Fed Jones, John Smith, George King or Wilma Abby

我认为 REReplace 可能有效,但我还没有找到正确的表达式。


1
reReplace 可能会有效,但 @Henry 提供的答案更易读。如果你需要修改它,这一点非常重要。 - Dan Bracuk
3个回答

14
如果您有一个数组,将最后一个元素与ArrayToList结合是最简单的方法(如Henry's answer所述)。
如果您将其作为字符串处理,使用rereplace是一种有效的方法,操作如下:
<cfset Names = rereplace( Names , ',(?=[^,]+$)' , ' or ' ) />

这句话的意思是匹配一个逗号,然后检查(不匹配)字符串末尾是否还有其他逗号(当然,这只适用于最后一个逗号,并将被替换)。


2
+1 因为它可以很好地处理单个元素(甚至是空)列表。 - Leigh
3
彼得的DNA由正则表达式组成,我亲眼见过。 - genericHCU
2
哈哈,_我希望!_(我真的希望;如果有任何精灵在附近,我有这个可爱的灯可以交换...) - Peter Boughton
1
我认为这是一个更好的解决方案,即使处理数组时也是如此。只需要使用arrayToList()函数并进行正则表达式替换,无需进行任何数组操作。当然,如果您正在处理"姓,名"类型的数组,例如 ["Jones, Fed", "Smith, John", "King, George", "Abby, Wilma"],那就是另外一回事了。 - Ketola
你也可以在每次按键前鼓掌十次,但那将是一种非常低效的打字方式。 - Peter Boughton
显示剩余6条评论

5

在转换成列表之前,先在数组层次上操作会更容易。

names = ["Fed Jones", "John Smith", "George King", "Wilma Abby"];
lastIndex = arrayLen(names);
last = names[lastIndex];
arrayDeleteAt(names, lastIndex);
result = arrayToList(names, ", ") & " or " & last;  
// result == "Fed Jones, John Smith, George King or Wilma Abby"

1
对这个答案的简洁程度表示赞赏。 - Dan Bracuk
6
如果数组长度是可变的,请确保调整代码以预测单个元素数组或空数组,以避免错误或重复值,例如“Fed Jones或Fed Jones”。 - Leigh

3
另一种选择是使用listLast和结果字符串的JAVA lastIndexOf()方法来处理列表/字符串。
<cfscript>
  names = ["Fed Jones", "John Smith", "George King", "Wilma Abby"];
  result = arraytoList(names,', ');
  last = listLast(result);
  result = listLen(result) gt 1 ? mid(result, 1, result.lastIndexOf(',')) & ' or' & last : result;
</cfscript>
<cfoutput>#result#</cfoutput>

结果:

Fed Jones,John Smith,George King或Wilma Abby


2
另一种写法是 mid(str,1,x) 可以写成 left(str,x) :) - Peter Boughton
我从未遇到过问题,而且我经常使用它。这并不意味着我永远不会遇到问题,但目前还没有。我想看一个例子。 - genericHCU
2
你的onError邮件中有“string”的值吗?如果该值是数字,那么可能会发生这种情况。如果你没有测试你的数据,这可能不是一个问题,但这是一个值得思考的好方法。 - genericHCU
1
我不会否认CF试图使所有东西都像字符串一样运作。如果你确定一个字符串是真正的Java字符串,我不会认为它是“盲目调用”,就像你不会认为javaCast()将所有东西转换为强制类型转换一样。将所有内容转换为安全的类型以及了解所使用的数据类型也具有附加值。 - genericHCU
2
只有在无法确定所需类型时才需要使用JavaCast,但这里不适用,因为如果您已经执行了ArrayToList,那么您就拥有了一个字符串。在已知字符串上调用lastIndexOf是可以的,并且不会盲目调用。 - Peter Boughton
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接