0

我正在尝试在 Javascript 中创建一个正则表达式,以将任何出现的:)与周围的文本分开。

鉴于以下情况:

:)这是一行文字:) 里面有几个笑脸:)。所以在那里。,:):)

我想得到结果 8 组:

  1. :)
  2. 这是一行文字
  3. :)
  4. 里面有几个笑脸
  5. :)
  6. . 所以那里.,
  7. :)
  8. :)

目前我使用([^:)]+)which 只对没有笑脸的周围文本进行分组。我可以进行哪些调整以使笑脸也被分组?

4

4 回答 4

2

分裂:

var string = "Given the following: :)This is a line of text :) with several smileys in it :). So there.,:):)";
var groups = string.split(/:\)/);

这将返回一个数组,其中每个元素都是文本的一部分,没有:).

由于文本已在 each 上拆分,我们可以通过在文本的每个部分之间:)添加 a 来构造您想要的结果::)

var parts = [groups[0]];
for (var i = 1; i < groups.length; ++i) {
    parts.push(':)');
    parts.push(groups[i]);
}

结果是这样的:

  1. :)
  2. 这是一行文字
  3. :)
  4. 里面有几个笑脸
  5. :)
  6. . 所以那里.,
  7. :)
  8. :)

在这里试试这个:http: //jsfiddle.net/Gxr6U/3/


如果你想用图像替换表情符号,你可以这样做:

var frags = document.createDocumentFragment();

frags.appendChild(document.createTextNode(groups[0]));

for (var i = 1; i < groups.length; ++i) {

    var img = document.createElement('img');
    img.src='http://../smiley.png';

    frags.push(img);

    frags.appendChild(document.createTextNode(groups[i]));
}

如果您只想删除表情符号:

var text = groups.join('');
于 2012-07-08T16:34:23.200 回答
2

我建议:

var str = ":)This is a line of text :) with several smileys in it :). So there.,:):)",
    matches = str.split(/(\:\))/);
console.log(matches);​

JS 小提琴演示

添加了过滤以从上面删除空匹配项:

var str = ":)This is a line of text :) with several smileys in it :). So there.,:):)",
    matches = str.split(/(\:\))/),
    matched = [];
for (var i = 0, len = matches.length; i < len; i++) {
    if (matches[i].length) {
        matched.push(matches[i]);
    }
}
console.log(matched);​

JS 小提琴演示

另一个版本,具有实际的屏幕输出:

var str = ":)This is a line of text :) with several smileys in it :). So there.,:):)",
    matches = str.split(/(\:\))/),
    matched = [], li,
    list = document.createElement('ol');
document.body.appendChild(list);
for (var i = 0, len = matches.length; i < len; i++) {
    if (matches[i].length) {
        matched.push(matches[i]);
        li = document.createElement('li');
        txt = document.createTextNode(matches[i]);
        li.appendChild(txt);
        list.appendChild(li);
    }
}
console.log(matched);​

JS 小提琴演示

于 2012-07-08T16:35:49.987 回答
0

您可以使用此模式:

/:\)|(?:[^:]+|:(?!\)))+/g

这匹配除or之外的:)任何一个字符或任何字符,它后面没有跟随 a 。::)

于 2012-07-08T16:43:46.070 回答
0

以下将成功地根据需要对您提到的字符串进行分组:

your_match = your_string.match(/(:\)|[^:)]*)/g)

但是,就像您原来的 RegExp 一样,如果 a :or)没有出现在笑脸中,您将遇到问题。如果不在笑脸中,这些字符将从匹配组中消失。

于 2012-07-08T16:34:55.980 回答