2

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

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

我必须粘贴上面的字符串并使用onkeyuptextarea 字段中的事件将其清理到:

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>
4

5 回答 5

2

哦!这是 , 和 的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)而不是那个正则表达式。 错误:该问题明确指出要摆脱的第三个块的长度是可变的。

双重编辑:在您的情况下,您可能只使用直接的正则表达式,正如其他人所展示的那样。如果你需要做任何更复杂的事情(案例转换、消毒等).split().map().join(),我认为舞蹈会更容易。

三重编辑:我在这里对前两个答案的表现进行了比较。从中得出任何你喜欢的结论。

于 2013-06-27T07:23:19.770 回答
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的演示。

如果您也想保留该76C00790块,请更改32.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(' '));
于 2013-06-27T07:24:41.030 回答
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')

于 2013-06-27T07:28:09.523 回答
0

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

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

这是关于 JSFiddle的演示。

于 2013-06-27T07:23:47.690 回答
0
myTextArea.value.replace(/(^|\n)\S+ \S+ \S+ /g, "$1")
于 2013-06-27T07:23:51.393 回答