Javascript 从多行字符串中删除前两个基于分隔符的块

Javascript 从多行字符串中删除前两个基于分隔符的块,javascript,Javascript,我找不到我问题的确切答案。这是要清理的字符串: 2012/04/21 21:48:33 76C00790 CE 49 AC FD 37 EB 58 05 11 31 9F 8B 36 38 59 44 2012/04/21 21:48:34 76C00790 E9 6F 24 88 AB C8 18 63 FA 1E A8 1C 6A DB D2 A7 2012/04/21 21:48:34 76C00790 BB 94 85 3D F7 AE 9E 9A DB 21 06 D7 BF 02 3

我找不到我问题的确切答案。这是要清理的字符串:

2012/04/21 21:48:33 76C00790 CE 49 AC FD 37 EB 58 05 11 31 9F 8B 36 38 59 44
2012/04/21 21:48:34 76C00790 E9 6F 24 88 AB C8 18 63 FA 1E A8 1C 6A DB D2 A7
2012/04/21 21:48:34 76C00790 BB 94 85 3D F7 AE 9E 9A DB 21 06 D7 BF 02 3A EB
2012/04/21 21:48:34 76C00790 1D 37 56 DA 6D 03 1E 10 3E F8 F8 EC 23 0B 63 62
2012/04/21 21:48:35 76C00790 49 29 B4 A7 4B 16 F5 94 73 89 4C 33 88 1E AC FB
2012/04/21 21:48:35 76C00790 DC A3 B5 D2
我必须粘贴上面的字符串,并使用textarea字段中的
onkeyup
事件将其清除,以便:

CE 49 AC FD 37 EB 58 05 11 31 9F 8B 36 38 59 44
E9 6F 24 88 AB C8 18 63 FA 1E A8 1C 6A DB D2 A7
BB 94 85 3D F7 AE 9E 9A DB 21 06 D7 BF 02 3A EB
1D 37 56 DA 6D 03 1E 10 3E F8 F8 EC 23 0B 63 62
49 29 B4 A7 4B 16 F5 94 73 89 4C 33 88 1E AC FB
DC A3 B5 D2
每条新行上的第一个块始终是日期,第二个块始终是时间,但第三个块的长度可以不同

所以我认为一个合理的分隔符应该是一个空格,但是我如何才能从每行中删除前3个块并保留其余的块呢

编辑

谢谢大家的帮助!! 因此,这是一个工作示例(在最新的FF中测试):


Ooh!这是
String.split
Array.map
Array.join
的完美例子。我一直在做这类事情:

data = data.split("\n").map(function(entry) {
  return entry.replace(/^\d{2}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2} [A-F0-9]+ /, "");
}).join("\n");
  • String.split
    将根据子字符串或正则表达式将字符串拆分为数组(对于我们,
    \n
  • Array.map
    将对数组中的每个元素运行函数,返回函数返回值的新数组
  • Array.join
    将使用字符串连接数组(在本例中,
    \n
编辑:您可能也可以使用
entry.substr(29)
代替该正则表达式。false:问题明确指出要去除的第三个块的长度可变

双重编辑:在您的情况下,您可能只需要使用一个直接的正则表达式,就像其他人所展示的那样。如果您需要做更复杂的事情(大小写转换、清理等),我认为
.split().map().join()
舞蹈会更容易


三重编辑:我把前两个答案的表现放在一起。从中得出您喜欢的任何结论。

考虑到它是一个字符串,请使用以下正则表达式:

str.replace( /\d{4}\/.{24}/g ,"");

这是关于JSFIDLE的。

这是一个非正则表达式的解决方案:

myTextArea.value.replace(/(^|\n)\S+ \S+ \S+ /g, "$1")
var str = "2012/04/21 21:48:33 76C00790 CE 49 AC FD 37 EB 58 05 11 31 9F 8B 36 38 59 44\n2012/04/21 21:48:34 76C00790 E9 6F 24 88 AB C8 18 63 FA 1E A8 1C 6A DB D2 A7";

var str = str.split("\n");      // Split the string into an array on newlines
for(var i = 0; i < str.length; i++) {
    str[i] = str[i].split(" "); // Split the string into an array on spaces
    str[i].splice(0, 3);        // Remove the first 3 blocks
    str[i] = str[i].join(" ");  // Join the array into a string with spaces

    alert(str[i]);              // CE 49 AC FD 37 EB 58 05 11 31 9F 8B 36 38 59 44
}

执行正则表达式拆分:

var arr = str.split(/\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2} .*? /g);
arr.shift(); //get rid of the first empty match
正则表达式检查日期:yyyy/mm/dd,然后是2位数:2位数:2位数,然后是空格前的所有字符。
g
标志表示正则表达式全局搜索(即使在第一次匹配之后也会继续搜索字符串)


arr
现在是每行的数组。要将其放入文本框中,可以使用
arr.join('\n')

将其转换回多行字符串。这是一个字符串还是字符串数组?您的字符串似乎有换行符,因此可以使用
/n
作为分隔符来获取数组中的每一行。然后只需
substring
前三个区块,您就可以编辑定义确切变量的帖子了吗?这是一个字符串:)比方说,从剪贴板复制并粘贴到一个textarea字段。OP说第三行的长度不同。是什么?如果他要分的话。最好使用子字符串(29)和第一个通缉字符的固定索引“29”来获取它们!它总是一样的,而且比用regex替换要快得多,考虑到您已经拆分了它,split+regex=太多进程。@CME64-您有数字支持您的“太多进程”声明吗?我想你会发现JavaScript引擎的速度会让你大吃一惊。此外,您的假设是错误的-所需文本的第一个字符并不总是在相同的偏移量。我在第一次修改答案时也犯了同样的错误。是的,split查找分隔符process=n,regex也查找要替换的参数is=2n processes,bigOh=2n^2=n^2,而您可以使用regex=2n来稍微减少它,但如果您拆分它并使用子字符串,则子字符串=n=>O(n^2)@CME64我希望看到一些实际的固体测量。我一次又一次地对各种JavaScript引擎中的快速和不快速感到惊讶。我认为避免使用正则表达式可能是个好主意。尽管您在变量名中的选择有问题:)+1@bozdoz我只使用了一个变量,
str
,就像在“string”中一样。我将
拆分
拼接
链接在一起,得到了不同的结果(仍然包含日期和时间)。从
拼接中删除
0,
(如您所做)似乎可以修复此问题。干得好谢谢你,伙计。干得好。您应该会得到答案,但您可能需要为OP提供一种方法,以便在
str
数组上执行联接('\n'),从而将字符串重新组合在一起:@DannyBeckett这可能是JavaScript的口号——“我没想到会这样!”哈哈。
var str = "2012/04/21 21:48:33 76C00790 CE 49 AC FD 37 EB 58 05 11 31 9F 8B 36 38 59 44\n2012/04/21 21:48:34 76C00790 E9 6F 24 88 AB C8 18 63 FA 1E A8 1C 6A DB D2 A7";

var str = str.split("\n");
for(var i = 0; i < str.length; i++)
    alert(str[i].split(' ').splice(3).join(' '));
var arr = str.split(/\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2} .*? /g);
arr.shift(); //get rid of the first empty match