从多行字符串中删除基于分隔符的前两个块
Remove first two blocks based on delimiter from multiline string
我找不到问题的精确答案。这是要清理的字符串:
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.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
)加入数组
EDIT:您可能也可以使用false:问题特别指出要去掉的第三个块的长度可变entry.substr(29)
而不是regex
双重编辑:在您的情况下,您可能只需要使用一个直接的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的演示。
- JQuery合并了keyup和focusout两个函数
- 如何使用 node.js 比较两个 json 数组
- 为复选框javascript指定两个值
- 用每小时的差值填充数组/列表-从下拉列表中给定两个时间值
- 单击时切换两个图像
- 我可以'我似乎不知道如何修复javascript中的两个lint.有人能帮我理解吗
- 基于两个条件退出While循环
- 如何在这里将两个值最低的数字相加
- 组合两个javascript函数
- 如何使用offer/answer交换来自两个对等连接的流
- jsf中两个字符串的颜色代码差异
- 基于两个分隔符进行拆分
- 我有一个**Rad Combo Box**,其中有两个分隔符.如何仅从分隔符中删除复选框
- 从多行字符串中删除基于分隔符的前两个块
- 如何替换两个分隔符之间的文本
- Javascript函数比较两个千位分隔符数字不工作
- 如何用千位分隔符解析两个空格分隔的数字
- 提前输入两个源和自定义分隔符
- 使用正则表达式基于两个分隔符拆分数组,并知道拆分的字符
- 如何使用逗号分隔符组合对象中同一属性的两个值