问题:
我正在努力创建一个正则表达式(在Google表格中为 ),该正则表达式将以逗号分隔的列表转换为标准的英语可读格式。
输入/输出示例:
当列表包含3个以上项,例如one,two,three
时,它应该返回one, two, and three
;如果列表包含2个项,例如one,two
,则它应该返回and and two
,并且如果列表仅包含1个项目,例如one
,则它应返回one
我的JavaScript方法:
这是我(可能效率低下)使用JavaScript中的一维数组实现相同功能的方法:
function joinWith(arr, sep, lastsep){ // e.g. joinWith(listOfNames, ",", "and")
sep += ' ', lastsep = ' ' + lastsep + ' ';
var rtn = [arr.slice(0, -1).join(sep) + (arr.length > 2 ? sep : ''), arr.slice(-1)[0]].join(arr.length < 2 ? '' : lastsep);
return rtn;
}
换句话说:
这就是我想做的(除非我当然想念):
这是我使用REGEXREPLACE尝试过的方法
=REGEXREPLACE(A1, ",\s*([^,]+)$", ", and $1")
这已经接近我想要的结果,但是当列表中有2个项目时,它会插入一个逗号,除非在项目中有3个或更多项目,否则我不希望出现这种情况。列表。
滥杀滥杀法
然后我采用了过度杀伤的方法,但是我希望在单个正则表达式中提供更优雅的方法:
=REGEXREPLACE(A1, ",\s*([^,]+)$", IF(COLUMNS(SPLIT(A1, ",")) > 2, ",", "") & " and $1")
答案 0 :(得分:1)
标点符号的一种约定是列表中"and"
之前没有逗号。即"item1, item2 and item3"
是格式化列表的正确方法。如果读者愿意,那么不要进行最后一步。此代码也没有使用环视功能,因为Google表格不支持环视功能。
您尝试将三个操作作为一个来执行...只需使用单独的操作即可。
操作:
使用对REGEXREPLACE
的嵌套调用,每个操作一个调用:
=REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(A1, "\s*, \s*", ", "), ", ([^,]+)$", ", and $1"), "^([^,]+), and ([^,]+)$", "$1 and $2")
如果您始终希望逗号在“和”之前,请不要执行最外面的操作。
免责声明:此答案是通过我的手机输入的,因此它可能无法正常工作甚至无法编译,但很有可能会起作用。