2015-03-03 2 views
1

У меня есть строка элементов в Excel, и когда я копирую их в текстовом поле, у меня есть несколько символов табуляции. Я использую это специально. Есть ли способ заменить n-ые символы табуляции новой строкой (каждая) и вставить определенное слово для каждой вкладки? Вот то, что я до сих пор http://jsfiddle.net/kjuxk7m9/Заменить n-й символ табуляции строкой с использованием Javascript/jQuery

<textarea rows="10" cols="50" onblur="this.value=this.value.replace(/\t/g, '\n')"> 

В принципе, когда я ввожу следующее в текстовое поле:

Item1 Item2 Item3 Item4 Item5 

(между элементами являются символы табуляции), мой результат должен был бы bebox:

Name1: Item1 
Name2: Item2 
Name3: Item3 
Name4: Item4 
Name5: Item5 

Кроме того, у меня может быть несколько символов табуляции один за другим Другие. Мне нужно было бы удалить их, чтобы у меня просто не было пустых строк после их замены новым символом строки. Кроме того, я бы предпочел не использовать встроенный javascript, даже если бы я сделал это в этом примере.

Спасибо!

UPDATE:

Введите текст:

Item1 Item2 Item3 Item4  item6 Item7 

Ожидаемый результат:

LastName: Item1 
FirstName: Item2 
PhoneNumber: Item3 
Nickname: Item4 
AnotherRandomCategory: 
Blog: Item6 
OtherDetail: Item7 

Item5 практически пример пустой ячейки в моей таблице, и копирование, которые добавьте дополнительный символ табуляции. Получив вышеуказанный результат, я смог бы удалить эту строку с кодом, так как у этой категории нет элемента. Элементы являются примерами, они на самом деле являются именами, числами и другими данными. Благодаря!

ответ

1

Это работает для примера:

document.querySelector('textarea').addEventListener('paste', function() { 
    var self= this; 
    setTimeout(function() { 
    self.value = 
     self.value.split(/\t+/) 
     .map(function(v, index) { 
     return 'Name'+(index+1)+': '+v; 
     }) 
     .join('\r'); 
    },1); 
}); 

Working Fiddle

Тайм-аут необходим, так как значение текстового поля не обновляется до после это событие пасты.

Текст split на символ табуляции, и этот массив обновляется с использованием map, затем join ред с символом новой строки.

Регулярное выражение /\t+/ вызывает split, чтобы игнорировать несколько вкладок в строке.

Если вы предпочитаете использовать событие размытия, тайм-аут не требуется:

document.querySelector('textarea').addEventListener('blur', function() { 
    this.value = 
    this.value.split(/\t+/) 
    .map(function(v, index) { 
     return 'Name'+(index+1)+': '+v; 
    }) 
    .join('\r'); 
}); 


Обновление на основе обсуждения

ниже код преобразует это: enter image description here

& hellip; в этом:

enter image description here

document.querySelector('textarea').addEventListener('paste', function() { 
    var self= this; 
    setTimeout(function() { 
    var flds=['LastName', 
       'FirstName', 
       'PhoneNumber', 
       'Nickname', 
       'AnotherRandomCategory', 
       'Blog', 
       'OtherDetail' 
      ], 
     order=[0, //LastName 
       1, //FirstName 
       3, //Nickname 
       2, //PhoneNumber 
       4, //AnotherRandomCategory 
       5, //Blog 
       6 //OtherDetail 
       ] 

    self.value = 
     self.value.split(/\t/) 
     .map(function(v, index) { 
     if(v==='' || index>=flds.length) { 
      return ''; 
     } 
     else { 
      return index+' '+flds[index]+': '+v+'\r'; 
     }; 
     }) 
     .sort(function(a,b) { 
     a= order[a.split(' ')[0]]; 
     b= order[b.split(' ')[0]]; 
     return a-b; 
     }) 
     .join('') 
     .replace(/\r\d+ /g,'\r') 
     .substr(2); 
    },1); 
}); 

Working Fiddle #2

+0

Это выглядит как хорошее решение, но я просто забыл упомянуть, что Name1, Name2 были просто случайные имена. У меня есть другие категории для этих значений, например: имя, фамилия, номер телефона. Прошу прощения за путаницу. Идея заключается в замене каждого символа табуляции на новую строку + другое имя для каждого элемента. За исключением первого элемента, поскольку перед ним нет вкладки. Перед этим мне просто нужна эта категория. –

+0

Это работает независимо от того, какие категории вы используете, за исключением того, что он всегда префикс их с помощью «Name1:» ... «Name2:» ... и т. Д. Если это не работает для вашего «Имя, фамилия, номер телефона», Например, можете ли вы обновить свой вопрос с ожидаемыми результатами? –

+0

Конечно, я только что обновил вопрос! Извините за беспорядок! –

1

Вам просто нужно регулярное выражение /([a-z]+(\d+))/gi, на котором мы будем действующие на основе групп, захваченных в нашей замены строки.

Мы сначала удаляем все пробелы, а затем с помощью указанного выше регулярного выражения, чтобы заменить его соответствующим образом.

document.querySelector('textarea').addEventListener('blur', function() { 
    this.value = this.value.replace(/\s+/g,"").replace(/([a-z]+(\d+))/ig, "Name$2:$1\n"); 
}); 

DEMO

+0

Это работает, однако я забыл упомянуть, что Name1, Name2 были просто случайными именами. У меня есть другие имена для этих значений, например: имя, фамилия, номер телефона. Прошу прощения за путаницу. –

Смежные вопросы