Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用“替换字符串中的最后一个逗号”;及;_Javascript_Jquery_Regex - Fatal编程技术网

Javascript 用“替换字符串中的最后一个逗号”;及;

Javascript 用“替换字符串中的最后一个逗号”;及;,javascript,jquery,regex,Javascript,Jquery,Regex,我得到了一个生成的字符串,它本质上是一个事物列表。这个字符串将由用户读取,因此我正在尝试对其进行良好的格式化。我使用逗号和空格分隔生成的列表: (a+'').replace(/,/g, ", "); 产生 1, 2, 3, 4 但是,我想把最后一个逗号改为“and”,这样它就可以 1, 2, 3, and 4 我尝试了以下方法: ((a+'').replace(/,/g, ", ")).replace(/,$/, ", and"); 但它不起作用,我认为这是因为它只在字符串末尾查找逗号,

我得到了一个生成的字符串,它本质上是一个事物列表。这个字符串将由用户读取,因此我正在尝试对其进行良好的格式化。我使用逗号和空格分隔生成的列表:

(a+'').replace(/,/g, ", ");
产生

1, 2, 3, 4
但是,我想把最后一个逗号改为“and”,这样它就可以

1, 2, 3, and 4
我尝试了以下方法:

((a+'').replace(/,/g, ", ")).replace(/,$/, ", and");
但它不起作用,我认为这是因为它只在字符串末尾查找逗号,而不是字符串中的最后一个逗号,对吗

同样,如果字符串中只有两个项目,我希望逗号被替换为“and”,而不是“and”,以便在语法上更有意义

我如何才能实现我所追求的目标?

你可能想要的

,(?=[^,]+$)
例如:

"1, 2, 3, 4".replace(/,(?=[^,]+$)/, ', and');
(?=[^,]+$)
检查此逗号后是否没有其他逗号<代码>(?!*)也可以

您甚至可以检查是否已经存在

,(?!\s+and\b)(?=[^,]+$)
工作示例:

如何:

((a+'').replace(/,/g, ", ")).replace(/,([^,]*)$/, ", and $1");
其中:

String.prototype.replaceAt=function(index, character) {
    return this.substr(0, index) + character + this.substr(index+character.length);
}
您可以使用这个简单的正则表达式。替换为
$1和
\1和
。请参阅演示

你可以试试

list1=[]
list2=[1, 2, 3, 4]
list2Str=(str(list2).replace("[","").replace("]","").replace("'",""))
for i in range (0,len(list2Str)):
  if list2Str[i] == ',':
    list1.append(i)
list1.sort(reverse=True)
list2Str = list2Str[:list1[0]] + ' and' + list2Str[list1[0]+1:]
print (list2Str)

有点啰嗦,但它可以工作并且相当简单

性能问题:哪个正则表达式在您的one和@ToToTo one之间的性能更好?@Colofbrix-我想vks的一个更快,我们甚至可以放弃捕获组(替换为
$&
)。根据我的经验,regex相对较慢,所以如果性能真的很重要,那么短字符串操作会更好。
(.*,)
var re = /(.*,)/gm;
var str = '1, 2, 3, 4';
var subst = '$1 and';

var result = str.replace(re, subst);
list1=[]
list2=[1, 2, 3, 4]
list2Str=(str(list2).replace("[","").replace("]","").replace("'",""))
for i in range (0,len(list2Str)):
  if list2Str[i] == ',':
    list1.append(i)
list1.sort(reverse=True)
list2Str = list2Str[:list1[0]] + ' and' + list2Str[list1[0]+1:]
print (list2Str)