Как разделить строку с несколькими правилами в JavaScript - PullRequest
1 голос
/ 19 февраля 2012

У меня есть эта строка, например:

str = "my name is john#doe oh.yeh";

конечный результат, который я ищу, это этот массив:

strArr = ['my','name','is','john','&#doe','oh','&yeh'];

, что означает, что применяются 2 правила:

  1. разделить после каждого пробела "" (я знаю как)
  2. если есть специальные символы ("." Или "#"), то также разделите, но добавьте символ "&" перед словом со специальным символом.

Я знаю, что могу использовать strArr = str.split ("") для первого правила. но как мне сделать другой трюк?

спасибо, Алон

Ответы [ 5 ]

6 голосов
/ 19 февраля 2012

Если предположить, что результатом будет '&doe', а не '&#doe', простое решение состоит в том, чтобы просто заменить все . и # на &, разделенные пробелами:

strArr = str.replace(/[.#]/g, ' &').split(/\s+/)

/\s+/ соответствует последовательным пробелам вместо одного.

Если результат должен быть '&#doe' и '&.yeah', используйте одно и то же регулярное выражение и добавьте захват:

strArr = str.replace(/([.#])/g, ' &$1').split(/\s+/)
1 голос
/ 19 февраля 2012

Вы должны использовать регулярное выражение, чтобы соответствовать всем специальным символам одновременно.Под «специальным» я предполагаю, что вы имеете в виду «без букв».

var pattern = /([^ a-z]?)[a-z]+/gi;             // Pattern
var str = "my name is john#doe oh.yeh";         // Input string
var strArr = [], match;                         // output array,  temporary var
while ((match = pattern.exec(str)) !== null) {  // <-- For each match
   strArr.push( (match[1]?'&':'') + match[0]);  // <-- Add to array
}
// strArr is now:
// strArr = ['my', 'name', 'is', 'john', '&#doe', 'oh', '&.yeh']

Он не соответствует последовательным специальным символам.Шаблон должен быть изменен для этого.Например, если вы хотите включить все последовательные символы, используйте ([^ a-z]+?).

Кроме того, в нем нет ничего, кроме последнего специального символа.Если вы хотите включить и этот, используйте [a-z]* и удалите !== null.

0 голосов
/ 19 февраля 2012

Это работает:

array = string.replace(/#|\./g, ' &$&').split(' ');

Взгляните на демо здесь: http://jsfiddle.net/M6fQ7/1/

0 голосов
/ 19 февраля 2012

Я думаю, вам нужна комбинация split () и replace ():

str = "my name is john#doe oh.yeh";

strArr = str.replace('\W',' &');

strArr = strArr.split(' '); 

Это должно быть близко к тому, что вы просили.

0 голосов
/ 19 февраля 2012

использовать метод split ().Вот что вам нужно: http://www.w3schools.com/jsref/jsref_split.asp

Хорошо.я видел, вы нашли это, я думаю:

1) сначала используйте разделение на пробелы2) итерируйте по вашему массиву, снова разделите на элементы массива, когда найдете # или.3) итерация по вашему массиву снова и str.replace("#", "&#") и str.replace(".","&."), когда вы найдете

...