使正则表达式将逗号分隔的列表(例如“一,二,三”)替换为“一,二和三”(如果有3个以上项),或者用“一和二”(如果有2个以上项)

时间:2019-03-02 23:26:28

标签: regex google-sheets regexp-replace

问题:

我正在努力创建一个正则表达式(在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;
}

换句话说:

这就是我想做的(除非我当然想念):

  1. 删除逗号周围的空白。
  2. 在每个逗号后添加一个空格。
  3. 在最后一项之前加上“和”。

这是我使用REGEXREPLACE尝试过的方法

=REGEXREPLACE(A1, ",\s*([^,]+)$", ", and $1")

这已经接近我想要的结果,但是当列表中有2个项目时,它会插入一个逗号,除非在项目中有3个或更多项目,否则我不希望出现这种情况。列表。

Here's a screenshot of my test case.

滥杀滥杀法

然后我采用了过度杀伤的方法,但是我希望在单个正则表达式中提供更优雅的方法:

=REGEXREPLACE(A1, ",\s*([^,]+)$", IF(COLUMNS(SPLIT(A1, ",")) > 2, ",", "") & " and $1")

And here's the screenshot of that approach.

1 个答案:

答案 0 :(得分:1)

标点符号的一种约定是列表中"and"之前没有逗号。即"item1, item2 and item3"是格式化列表的正确方法。如果读者愿意,那么不要进行最后一步。此代码也没有使用环视功能,因为Google表格不支持环视功能。

您尝试将三个操作作为一个来执行...只需使用单独的操作即可。

操作:

  1. 正确格式化逗号和空格
  2. 用“和”代替最后一个逗号
  3. 如果有2个以上的词,请在“和”之前放置逗号

使用对REGEXREPLACE的嵌套调用,每个操作一个调用:

=REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(A1, "\s*, \s*", ", "), ", ([^,]+)$", ", and $1"), "^([^,]+), and ([^,]+)$", "$1 and $2")

如果您始终希望逗号在“和”之前,请不要执行最外面的操作。

免责声明:此答案是通过我的手机输入的,因此它可能无法正常工作甚至无法编译,但很有可能会起作用。