Lucee/CF - 清理以逗号分隔的列表

Lucee/CF - Clean up comma delimited list

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

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先空格再排序。试试下面的代码

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

这是使用相同基本思想的另一种方法。循环遍历列表项并 trim 它们,然后最后排序。工作示例 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>

对于正则表达式选项,您可以使用匹配模式 \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