Javascript正则表达式与替换

时间:2017-02-27 12:29:32

标签: javascript regex expression

我正在开展有关emojireplace搜索的项目 但我在regular expression上遇到了一些问题,下面提到的是我的参考代码:

var f = ["( :3 )" , "( :P )","\(:star:\)"];

var re =  function(s){return new RegExp(s, 'g');};

现在,当我要搜索emojireplace时,如下所示:

s = "hello :D how are you :P dwdwd";
for(var n in f){    

var m; 
if ((m = re(f[n]).exec(s)) !== null) {

m.forEach((match, groupIndex) => {
  s = s.replace(match,"<img src='http://abs.twimg.com/emoji/v1/72x72/"+ r[n] +".png'>");
});

}}

在这种情况下,它运行良好并替换emoji。但只有在emoji之前和之后有空格才能替换我应该怎么做才能替换字符串开头或结尾的emoji

s = ":D hello how are you :)";

这种情况不起作用。我如何编辑我的regular expression,以便能够在字符串的开头和结尾替换emoji,同时如果它在字符串&amp;中间找到它在单词和emoji

之间有空格

regular expression的第二个问题是"\(:star:\)",它永远不会取代。虽然它必须用:star:替换单词emoji但我想我会错过regular expression上的某些内容。

4 个答案:

答案 0 :(得分:1)

你可以使用开头和&amp;结束锚与管道一起实现这一点。例如:

/(^:3\s)|(\s:3\s)|(\s:3$)/g

^是一个锚点,它将:3\s与字符串的开头匹配。

$是一个将\s:3与字符串末尾匹配的锚点。

\s匹配空格。

|是管道运算符,它充当不同捕获组之间的逻辑OR运算符。

答案 1 :(得分:0)

只需删除表情符号正则表达式中的空格。

var f = ["(:3)", "(:P)", "\(:star:\)"];
var r = ["[sadface]", "[toungeface]", "[staremoji]"];

var re = function(s) {
  return new RegExp(s, 'g');
};

s = "hello :3 how are you :P dwdwd :star: :3";
console.log(s);
for (var n in f) {
  var m;
  if ((m = re(f[n]).exec(s)) !== null) {
    m.forEach((match, groupIndex) => {
      s = s.replace(match, r[n]);
    });
  }
}

console.log(s);

答案 2 :(得分:0)

var content = "hello :D how are you :P dwdwd";
content = content.replace(/((:D|:P))/g,function(match){
  var result = "";
  
  var index = -1;
  switch(match)
  {
    case ":D":
      result = "happy";
      index = 0
      break;
    case ":P":
      result =  "smilie";
      index = 1
      break;
  }
  if(index != -1)
  {
    return "<img src='http://abs.twimg.com/emoji/v1/72x72/"+index+".png'>";
  }
  return result;
});
console.log(content);

请试一试。

答案 3 :(得分:0)

我创建了一个更通用的解决方案,从emojis到相关名称的映射开始。我使用了一个对象,而不是两个需要保持同步的列表:

const emojis = {
  '(c)': 'a9',
  '(r)': 'ae',
  '(tm)': '2122'
  //, ...
};

这让我觉得它是一个更有用的结构,但下面的代码可以很容易地改变来处理双列表版本。

然后我使用辅助函数来转义正则表达式中不允许作为纯文本的字符,方法是将它们添加到\

const escapeSpecials = (() => {
  const specials = ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'];
  const reg = new RegExp('(\\' + specials.join('|\\') + ')', 'g');
  return str => str.replace(reg, '\\$1'); 
})();

然后我有关键功能:

const replaceStringsWith = (emojis, convert) => str => Object.keys(emojis).reduce(
  (str, em) => str.replace(new RegExp(`(^|\\s+)(${escapeSpecials(em)})($|\\s+)`, 'g'), 
                           (m, a, b, c) =>  `${a}${convert(emojis[b], b)}${c}`),
  str
);

这需要一个包含字符串/替换对的对象和一个接受替换的转换器函数,并返回最终形式。它返回一个函数,该函数接受一个字符串,然后在对象的键上搜索任何匹配项(正确检查字符串或字符串结尾),将其替换为对象的特定键的值调用转换器的结果。 / p>

因此我们可以做到:

const toUrl = (name) => `<img src='http://abs.twimg.com/emoji/v1/72x72/${name}.png'>`; 
const replaceEmojis = replaceStringsWith(emojis, toUrl)

并将其命名为

const s = "This is Copyright (c) 2017, FooBar is (tm) BazCo (r)";
replaceEmojis(s); //=>
// `This is Copyright <img src='http://abs.twimg.com/emoji/v1/72x72/a9.png'>
// 2017, FooBar is <img src='http://abs.twimg.com/emoji/v1/72x72/2122.png'>
// BazCo <img src='http://abs.twimg.com/emoji/v1/72x72/ae.png'>`

请注意,转换器还会采用第二个参数。所以你可以改用

const toUrl = (name, emoji) => 
  `<img src='http://abs.twimg.com/emoji/v1/72x72/${name}.png' title='${emoji}'>`;

获取

//=> `This is Copyright <img    
// src='http://abs.twimg.com/emoji/v1/72x72/a9.png' title='(c)'>
// 2017, FooBar is <img src='http://abs.twimg.com/emoji/v1/72x72/2122.png'
// title='(tm)'> BazCo <img src='http://abs.twimg.com/emoji/v1/72x72/ae.png' title='(r)'>"