【问题标题】:Lucee/CF - Clean up comma delimited listLucee/CF - 清理逗号分隔列表
【发布时间】:2018-08-01 20:22:39
【问题描述】:

我有一个格式不一致的项目列表,我需要对其进行排序。

item 1,  item 3.0   ,item 8    ,    item 1.0 , item 4, item 5, item 6, item 10

基本上,有些项目可以在逗号 (,) 之前或之后有空格(多个偶数)。

我尝试 listtoarray 然后排序,但我发现排序保留了空格,导致项目 1 和项目 1.0 无法正确排序。我想我可以使用 listtoarray 来删除空格,但也许我正在考虑一个不同的函数,或者我可能需要通过循环遍历我的列表?

有人可以刷新我对这个基本任务的记忆吗???

更新 预期结果应该是:

第 1 项,第 10 项,第 3.0 项,第 4 项,第 5 项,第 6 项,...等

【问题讨论】:

  • 你试过Trim分割值吗?
  • 修剪会起作用,但我必须遍历列表并对单个项目进行一些处理。如果我没记错的话,可以做一些事情来自动修剪空间,就像函数的核心性质一样。我想我很久以前在 Ben Nadel 的博客甚至 Rayond Camden 的博客上读过它。

标签: list coldfusion lucee


【解决方案1】:

对于正则表达式选项,您可以使用匹配模式\s*,\s*。此模式读取为匹配任何,,前面有 0 个或多个空白字符,后面有 0 个或多个空白字符。然后我们可以使用reReplace 将这些匹配项替换为不带空格的,

<cfscript>
    myList="item 1,  item 3.0   ,item 8    ,    item 1.0 , item 4, item 5, item 6, item 10";
    myList = reReplace(trim(myList), "\s*,\s*", ",", "all");
    myList = listSort(myList, "textnocase", "asc");
    writeOutput(myList);
</cfscript>

TryCF.com example
regex101.com example

【讨论】:

  • 我刚看到这个,哇,这比我想象的要容易得多。让我想重温我的正则表达式技能!
  • @user9263373 我在regexone.com 网站上学习了正则表达式的基础知识。绝对是一项很棒的技能。
【解决方案2】:

您可以先修剪空格,然后再排序。试试下面的代码

<cfset listA = "item 1,  item 3.0   ,item 8    ,    item 1.0 , item 4, item 5, item 6, item 10">    
<cfset b = arrayMap(listtoarray(listA),function(item,index,arr){return Trim(item)})>    
<cfset arraySort(b,"text","asc") >
<cfdump var="#b#">

更新

这也可以使用 listMap 来完成

<cfscript>
    myList="item 1,  item 3.0   ,item 8    ,    item 1.0 , item 4, item 5, item 6, item 10";
    myList=ListMap(myList,function(item){return Trim(item);});
    myList = listSort(myList, "textnocase", "asc");     
    writeOutput(myList);
</cfscript>

【讨论】:

【解决方案3】:

这是使用相同基本思想的另一种方式。遍历列表项并修剪它们,然后最后排序。工作示例here

<cfscript>
    myList = "item 1,  item 3.0   ,item 8    ,    item 1.0 , item 4, item 5, item 6, item 10";

    i = 1;
    for (item in myList) {
        myList = listSetAt(myList, i, trim(item));
        i++;
    }

    myList = listSort(myList, "textnocase", "asc");    

    writeOutput(myList);
</cfscript>

【讨论】:

  • 我对此表示赞同,因为它确实有效(并且您使用了 cfscript +1)并且确实回答了我的循环问题,但我仍然认为还有另一个函数可以做到这一点。
  • @HPWD 感谢您的支持。顺便说一句,我不相信有办法不循环,除非你是一个正则表达式大师(我什至没有接近资格)并使用reReplace()
  • @HPWD Challenge...用赏金更新您的问题,看看是否有人只能使用正则表达式来做到这一点:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多