2013-06-27 1 views
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 

я должен вставить выше строку и очистить его с onkeyup события в поле TEXTAREA, это:

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 блока из каждой строки и оставить остальные?

EDIT

Спасибо всем за помощь !! Итак, это рабочий пример (проверено в последнем 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

это одна строка или массив строк? – CME64

+1

Кажется, ваша строка имеет разрывы строк, поэтому вы можете использовать '/ n' в качестве разделителя для получения каждой строки в массиве. Тогда просто «подстрока» первых трех блоков – Atrox111

+0

вы могли бы изменить свое сообщение, определяющее точную переменную? – fcalderan

ответ

2

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)

EDIT: Вы могли бы использовать только entry.substr(29) вместо этого регулярного выражения.false: в вопросе конкретно указывается, что третий блок, который должен освободиться, имеет переменную длину.

ДВОЙНОЙ РЕДАКТИРОВАНИЕ: В вашем случае вы могли бы просто использовать прямое регулярное выражение, вместо этого, как показали другие люди. Если вам нужно сделать что-нибудь более сложное, хотя (конвертация случаев, санитария и т. Д.), Мне кажется, легче будет танцевать .split().map().join().

TRIPLE EDIT: Я собрал a comparison результатов двух лучших ответов здесь. Сделайте любой вывод, который вам нравится.

+0

OP говорит, что третья строка будет иметь разную длину. – bozdoz

+0

О! Так он и делает. Исправлена! – deoxxa

+0

wth? если он собирается разбить его. лучше использовать их с помощью подстроки (29), используя фиксированный индекс «29» первого желаемого символа! это всегда одно и то же, и это быстрее, чем замена регулярным выражением, поскольку вы уже разделили его, split + regex = слишком много процессов. – CME64

0

Учитывая это одна строка, используйте этот RegEx:

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

Вот a demo на JSFiddle.

0
myTextArea.value.replace(/(^|\n)\S+ \S+ \S+ /g, "$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 
} 

Вот a demo на JSFiddle.

Если вы хотите сохранить блок 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 – bozdoz

+0

@bozdoz Я использовал только одну переменную 'str', как в строке. –

+0

Итак, ваш выбор в том, чтобы не создавать новое имя в цикле for. Использование 'str [i]' так часто, как вы, немного вводит в заблуждение. – bozdoz

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 

Очередные проверяет выражение для даты: гггг/мм /, затем 2 цифры: 2 цифры: 2 цифры, затем любые символы до пробела. Флаг g означает, что регулярное выражение ищет глобально (продолжает поиск строки даже после первого совпадения).

arr - это массив каждой строки. Чтобы поместить его в текстовое поле, вы можете преобразовать его обратно в многострочную строку с arr.join('\n').