移除JavaScript中的井号符号,使用正则表达式

3

我在论坛上尝试搜索,但找不到与我所需完全相似的内容。我基本上想要从我所收到的结果中删除#符号,以下是正则表达式的虚拟示例。

let postText = 'this is a #test of #hashtags';
var regexp = new RegExp('#([^\\s])', 'g');
postText = postText.replace(regexp, '');

console.log(postText);

它会产生以下结果。
this is a est of ashtags

我需要改变什么才能只删除标签而不切断每个单词的第一个字母?

1
还记得“井号符号”只被称为“井号”吗?Pepperidge Farm 记得。 - Joachim Sauer
4个回答

5
你需要一个反向引用$1作为替换内容:

let postText = 'this is a #test of #hashtags';
var regexp = /#(\S)/g;
postText = postText.replace(regexp, '$1');
console.log(postText);
// Alternative with a lookahead:
console.log('this is a #test of #hashtags'.replace(/#(?=\S)/g, ''));

注意,我建议将构造函数表示法替换为正则表达式字面量表示法,以使正则表达式更易读,并将[^\s]更改为更短的\S(任何非空格字符)。
在这里,/#(\S)/g匹配多个出现(由于g修饰符)的#和紧随其后的任何非空白字符(同时将其捕获到第1组中),String#replace将用后面的字符替换找到的匹配项。
或者,为避免使用反向引用(也称为占位符),您可以使用前瞻,例如.replace(/#(?=\S)/g, ''),其中(?=\S)要求当前位置右侧紧接着一个非空格字符。如果您还需要删除字符串末尾的#,请将(?=\S)替换为(?!\s),它将在下一个字符是空格时失败匹配。

1
非常感谢,你救了我的命 :) 我希望这个线程能帮助到有同样问题的人 :) - Stas

1
也许更容易的方法是编写自己的函数,可能会像这样:(涵盖了符号重复的用例)
  function replaceSymbol(symbol, string) {
    if (string.indexOf(symbol) < 0) {
      return string;
    }

    while(string.indexOf(symbol) > -1) {
      string = string.replace(symbol, '');
    }

    return string;
  }



var a = replaceSymbol('#', '##s##u#c###c#e###ss is he#re'); // 'success is here'

1
你可能可以使用以下内容:
let postText = 'this is a #test of #hashtags';
postText = postText.replace(/#\b/g, '');

它依赖于一个假设:一个#hashtag#和后面的单词之间包含了一个单词边界。通过使用\b匹配该单词边界,我们确保不匹配单个#
然而,它可能会匹配更多内容,因为在正则表达式中,“单词字符”的定义并不明显:它包括数字(所以#123会被匹配),更令人困惑的是,下划线字符(所以#___会被匹配)。
我不知道是否有权威来源来定义这些是否可接受的hashtag,所以我将让你自己判断是否符合你的需求。

0

你只需要使用 #,括号中的内容匹配 # 后面的任何其他内容

postText = postText.replace('#', '');

这将替换所有 # 符号


这将仅替换第一个遇到的#,请参见上面的解决方案。 - Maksym Shevchenko

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