Javascript在不同大小的子字符串中拆分字符串

时间:2014-10-15 16:48:43

标签: javascript arrays string splice

我需要编写一个算法,给出一个十六进制字符串,生成一个包含4个十六进制数字的5个元素的数组和另一个包含2个十六进制数字长度的数组的数组。独特的两个前提是:

  • 如果4位数字符串=“0000”则不考虑它,如果2位长的十六进制是“00”(编辑:或“01”),则不要考虑它。
  • 不要将用于5个4char字符串的数字用于2char字符串。我不介意,如果一个从头开始,另一个从结束或中间开始,或者从中间开始......我的意思是子串不需要连续,它们只需要与0不同两个数组中没有使用相同的字符串位置。编辑:想象一下,使用前20个字符构建五个4char序列(在每四个字符分割主字符串后没有“0000”序列)。这意味着两个2char序列不必考虑前20个字符,因为它们已被使用。

一个正确输出的示例:

字符串:87b86156d0000a4200005e02002f56614f7a2f54f7ebf45670ed62cbaa78e6f228297b0e7338215fb4

第一个数组:[“87b8”,“6156”,“d000”,“0a42”,“5e02”]

第二个数组:[“2f”,“56”]

我的方法是这样开始的:

var mystring = "87b86156d0970a4200005e02612f56614f7a2f54f7ebf45670ed62cbaa78e6f228297b0e7338215fb4"
var firststring = mystring.match(/.{1,4}/g);

这给了我:

[“87b8”,“6156”,“d097”,“0a42”,“0000”,...]

然后:

for (x=0;x<firststring.length;x++){
        if (firststring[x]=="0000") {firststring.splice(x, 1)}
}

  var secondstring = mystring.match(/.{1,2}/g);

这给了我:

[“87”,“b8”,“61”,“56”,“d0”,“97”......]

for (x=0;x<secondstring.length;x++){
        if (secondstring[x]=="00") {secondstring.splice(x, 1)}
}

这里是我丢失的地方,我不知道如何编码我避免在两个阵列中使用的主要字符串数字(位置)的部分......

此致

1 个答案:

答案 0 :(得分:1)

嗯,它不漂亮,但它有效:

var str = "87b86156d0970a4200005e02612f56614f7a2f54f7ebf45670ed62cbaa78e6f228297b0e7338215fb4";

var grabLength = 4,
    // 4-char strings
    grp1 = [],
    // 2-char strings
    grp2 = [],
    chunk;

while(chunk = str.slice(0, grabLength)) {
  str = str.slice(grabLength);

  // skip all zeros
  if (/^0+$/.test(chunk)) continue;

  if (grabLength === 4) {
    if (grp1.push(chunk) === 5) {
      grabLength = 2;
    }
    continue;
  }

  // skip 2-char sequences that match the start of a 4-char sequence
  var hasMatch = false;
  for (var i = 0; i < grp1.length; i++) {
    if (chunk === grp1[i].slice(0, 2)) {
      hasMatch = true;
      continue;
    }
  }
  if (hasMatch) continue;

  grp2.push(chunk);

  if (grp2.length === 2) break;
}

console.log(grp1);
console.log(grp2);

<强> JSBin