创建一个正则表达式以替换字符串中最后一次出现的字符

6

我需要创建一个正则表达式,它应该查找字符串中最后一个“*”,不考虑字符串中的空格。然后,我需要用一些文本替换该字符串。

目前,它只替换了字符串中第一个“*”。

我该如何解决?

这是我的代码:

const regex = /\*/m;
const str = 'Field Name* * ';
const replaceStr = ' mandatory';
const result = str.replace(regex, replaceStr);
console.log('Substitution result: ', result);

这里应该输出“字段名称*必填”。但我得到的是“字段名称必填*”。
3个回答

4

不要使用正则表达式,而是使用以下方法:String#substringString.lastIndexOf

const str = 'Field Name* * ';
const replaceStr = 'mandatory';
const lastIndex = str.lastIndexOf('*');
const result = str.substring(0, lastIndex) + replaceStr + str.substring(lastIndex + 1);

console.log('Substitution result: ', result);

还想使用正则表达式吗?

const regex = /\*([^*]*)$/;
const str = 'Field Name* * Hello World!';
const replaceStr = ' mandatory';
const result = str.replace(regex, (m, $1) => replaceStr + $1);
console.log('Substitution result: ', result);


你的解决方案是正确的,但我需要在这里使用正则表达式。 - Sunny
@Sunny 添加了正则表达式。 - Tushar
@Sunny 顺便问一下,为什么你只想要正则表达式的解决方案? - Tushar
我们在项目中随处使用正则表达式进行替换。因此,在这里也需要使用它。 - Sunny
1
@Sunny 我建议尽可能使用字符串替换,它比正则表达式替换更快。 - Tushar

3

短小的正则表达式魔法(在扩展输入的str上显示):

const regex = /\*(?=[^*]*$)/m,
      str = 'Field Name* * * * ',
      replaceStr = ' mandatory',
      result = str.replace(regex, replaceStr);
console.log('Substitution result: ', result);

  • (?=[^*]*$) - 前瞻正向断言,确保前面的\*只有在后面跟着[^*]*(非星号字符一直到字符串末尾$)时才匹配

1

在最后一个 * 前,只需让 .* consumecapture 它。用 captured $1 mandatory 替换。

let str = 'Field Name* * ';
let res = str.replace(/(.*)\*/,'$1mandatory');
console.log(res);

在regex101上查看此演示

  • 如果你有字段名称* *abc并想要去掉末尾,使用(.*)\*.*
  • 如果你有多行输入,请使用[\S\s]*代替.*以跳过换行符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接