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

Remove first two blocks based on delimiter from multiline string

本文关键字:两个 分隔符 字符串 删除      更新时间:2023-09-26

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

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

我必须粘贴上面的字符串,并用文本区域字段中的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>

哦!这是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)加入数组

EDIT:您可能也可以使用entry.substr(29)而不是regexfalse:问题特别指出要去掉的第三个块的长度可变

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

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

这里有一个非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块,请在splice中将3更改为2


这是一个较短的版本,感谢@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(' '));

执行正则表达式拆分:

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位数:两位数,然后是空格之前的任何字符。g标志表示正则表达式进行全局搜索(即使在第一次匹配之后也继续搜索字符串)。

CCD_ 17现在是每条线的阵列。要将其放入文本框中,可以使用arr.join(''n')将其转换回多行字符串。

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

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

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

这里有一个关于JSFiddle的演示。