3

我想全部替换:):D,除非它们在引号内"

示例 1:

Hey man :D, how're you? :) My friend told me "this can't be true :)"

变成

Hey man :D, how're you? :D My friend told me "this can't be true :)"

如您所见,:)如果它被 . 包围,则不会被替换"。如果没有这个条件,那就很简单了吧?我正在使用 Javascript (jQuery) 来完成这一切。

如果使用正则表达式显然无法做到这一点,那么替代建议是什么?

4

3 回答 3

6

假设没有双引号是不平衡的,这是应该为您工作的正则表达式:

:\)(?=(?:(?:[^"]*"){2})*[^"]*$)

解释:这个正则表达式使用了一个积极的前瞻,它基本上匹配 0 次或多次出现的一对some text until a double quote is foundie([^"]*"){2}在每个匹配项的右侧(RHS):)

简单来说,这意味着仅当 a 在双引号之外时才替换它,因为双引号内的所有匹配项在 RHS 上:)都将具有奇数个匹配项。[^"]*"

现场演示: 1. http://www.rubular.com/r/3aixZy5bYR

现场演示:2. http://ideone.com/C679NW

于 2013-04-01T10:19:09.657 回答
0
function parseSmiley(str){
    return str.replace(/(?!"):\)(?!")/g, ":D");
}

console.log(parseSmiley('Hey man :D, how\'re you? :) My friend told me "this can\'t be true :)"');

和一个输入的小提琴,所以你可以测试

:)基本上,我们只是将所有未封装的实例替换" ":D

于 2013-04-01T10:16:24.137 回答
0

如果您需要变量来控制这一点 - 那么您可以尝试

function doReplace(find, repl, str, fullWordsOnly, ignoreSQuotes,  ignoreDQuotes, caseSensitive) {
   if (caseSensitive == undefined) caseSensitive = false;

   var flags = 'gm';
   if (!caseSensitive) flags += 'i';

   var control = escapeRegExp(find);
   if (ignoreDQuotes) control = '(?!\\B"[^"]*)' + control + '(?![^"]*"\\B)';
   if (ignoreSQuotes) control = '(?!\\B\'[^\']*)' + control + '(?![^\']*\'\\B)';
   if (fullWordsOnly) control = '\\b' + control + '\\b';

   return str.replace(new RegExp(control, flags), repl);

}

请注意,当使用诸如 how're 和 can't 之类的缩写词时,单引号可能会出现问题,因此我还提供了一个 hack 来解决这个问题:

// Fix any abbreviated words ('re or 't) 
str=str.replace(/'re\/b/gi, ''re');
str=str.replace(/'t\b/gi, ''t');

有关工作演示,请参见http://jsfiddle.net/Abeeee/ct7vayz5/4/

于 2021-10-03T19:33:32.140 回答