根据多行字符串中的分隔符删除前两个块

时间:2013-06-27 07:18:55

标签: 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 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中测试):

<html>
<head>
<script language="javascript">
<!--
function clean(input) {
 input.value = input.value.split("\n").map(function(entry) {
  return entry.replace(/^\d+\/\d+\/\d+ \d+:\d+:\d+ [A-F0-9]+ /, "");
 }).join("\n");
}
-->
</script>
</head>
<body>
 <textarea id="f" cols="80" rows="7"  onkeyup="javascript:clean(this);"></textarea>
</body>
</html>

5 个答案:

答案 0 :(得分:2)

噢!这是String.splitArray.mapArray.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()舞会更容易。

TRIPLE EDIT:我在这里列出了前两个答案的a comparison表现。从中得出任何你喜欢的结论。

答案 1 :(得分:2)

这是一个非RegEx解决方案:

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
}

这是JSFiddle上的a demo

如果您想要保留76C00790块,请将3更改为2中的splice


这是一个较短的版本,感谢@bozdoz:

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(' '));

答案 2 :(得分:1)

正则表达式拆分:

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')的多行字符串。

答案 3 :(得分:0)

考虑到它是一个字符串,请使用此RegEx:

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

这是JSFiddle上的a demo

答案 4 :(得分:0)

myTextArea.value.replace(/(^|\n)\S+ \S+ \S+ /g, "$1")