如何从javascript中的字符串中获取唯一字符列表?

时间:2015-01-16 04:38:37

标签: javascript regex duplicate-removal

我有一些文本文件,每个文件都包含西方和中文字符。我想要一个出现在每个文件中的中文字符列表。

我试过了

ch = text.match(/[\u4E00-\u9FFF]/g); // unicode usual chinese characters - that'll do for me
if (ch != null) {
    alert(ch);
}

这给了我中文字符列表,但有一些重复。例如:

肉,捕,兵,死,兵,半,水

表示文件

卵,水,半,水,土,木,水,清,慢,底,海,海,海,清,清,清,木,清,慢,底,清,土,半,水,水,土,半,水,土

换另一个......

1)我不需要那些逗号。哪儿来的? (我可以通过一次替换取消它们,但由于我正在使用正则表达式,我认为如果我在正则表达式内部解决它可能会更快。)

2)如何获得唯一的价值观?例如:

肉捕兵死半水

表示第一个文件

卵水半土木清慢底海

第二次......

4 个答案:

答案 0 :(得分:2)

逗号来自默认数组到字符串转换。使用ch.join('')将数组转换为字符串。

要删除重复值,请使用以下行:

ch = text.match(/([\u4E00-\u9FFF])/g);
ch = ch.filter(function (c, i) { return ch.indexOf(c) === i; }).join('');

答案 1 :(得分:2)

Array.prototype.getUnique = function(){
   var u = {}, a = [];
   for(var i = 0, l = this.length; i < l; ++i){
      if(u.hasOwnProperty(this[i])) {
         continue;
      }
      a.push(this[i]);
      u[this[i]] = 1;
   }
   return a;
}


ch = text.match(/([\u4E00-\u9FFF])/g);
var result_string = ch.getUnique().join("");

答案 2 :(得分:1)

试试这个:

var text    =   "卵水半水土木水清慢底海海海清清清木清慢底清土半水水土半水土",


    re      =   /([\u4E00-\u9FFF])/g,
    unique  =   {},
    chars   =   "", c;

while(c = re.exec(text)){
    if(!unique[c[0]]){
        chars += c[0];
        unique[c[0]] = true;
    }
}
chars.split("");

返回了:

["卵", "水", "半", "土", "木", "清", "慢", "底", "海"]

是的,您看到的逗号是当浏览器将数组类型化为字符串时:它将每个值的字符串表示与逗号连接在一起。我猜这是来自原始示例中的“alert”调用,该示例正在提供一个数组(从字符串的“Match”方法返回)。

旧版浏览器不支持Array的“过滤器”方法,但是填充很容易(如果你只关心支持最近的IE9代理,那肯定没必要。)

答案 3 :(得分:0)

有一个带有正则表达式的单行解决方案:

input.match(/([\u4E00-\u9FFF])(?![\s\S]*\1)/g)

然而,我不建议使用它,因为在最坏的情况下它会有O(n * k)复杂度(当字符串主要包含中文字符时),其中n是字符串的长度,k是唯一的汉字字符数。为什么O(n * k)?由于前瞻(?![\s\S]*\1)基本上表示&#34;声称您无法在字符串的其余部分找到第一个捕获组中匹配的任何内容的另一个实例&#34;

@Ruben Kazumov的

This answer是一个合理的选择。它的复杂性取决于在Object中设置和获取属性的实现,在合理的实现中,每个操作应该是子线性的。