Как разбить эту строку на массив - PullRequest
1 голос
/ 17 февраля 2012

Если у меня есть строка, как показано ниже, и она не является статичной каждый раз.

 var str = "#a
            b
            c
            _
            ele1
            ele2
            #d
            e
            f
            _
            ele3
            ";

из приведенной выше строки я хочу получить массив, как показано ниже

     arr = [ "#a
               b
               c
              _",
             "ele1",
             "ele2",
             "#d
               e
               f
              _",
             "ele3"
           ]

Критерий: все между # и _ как один элемент;каждая строка за пределами этих разделителей является отдельным элементом.

Как я могу это сделать. Любая идея .... Пожалуйста, используйте this fiddle.

Ответы [ 5 ]

4 голосов
/ 17 февраля 2012

Опять же, учитывая критерии в комментарии это работает

var arr = str.match(/(?:#([^_]*)_|([^#_\s])+)/g) 

http://jsfiddle.net/fhDPj/1/

И объяснить регулярное выражение

  • #([^_]*)_ - найдите все, что не _, которое находится между # и _ (* означает, что даже пустые строки будут захвачены)
  • ([^#_\s])+ - найти все, что не является #, _ или пробелом (+ означает, что захватываются только непустые строки)
  • (?: | ) - найти любой из вышеперечисленных (но без захвата, так как вышеприведенные выражения уже захватывают необходимые строки)
  • / /g - глобальное совпадение, чтобы вернуть все совпадения в строке, а не только первое
3 голосов
/ 17 февраля 2012

пробелы являются преднамеренными?

попробуйте вместо этого:

<div id ="a">#abc_ele1ele2#def_ele34</div>​

сценарий:

var str = $('#a').text();
var result = str.match(/(#[^_]*_)|([^#][^\d]*\d{1,})/g)
console.log(result)

EXPLANATION:
string.match()      - returns an array of matches
#[^_]*_             - finds anything that begins with # and ends with _ and with anything but _ in between
[^#][^\d]*\d{1,}    - finds anything with that does NOT start with #, followed by 0 or more non-numeric characters,  and ends with at least one digit

DEMO : проверьте вашу консоль

это все равно будет работать со всеми этими пробелами. Вы ДОЛЖНЫ быть ясными со своими правилами разделения.

1 голос
/ 17 февраля 2012

Учитывая критерии в моем комментарии под вопросом:

var str = "#a\nb\nc\n_\nfoo\nbar\n#d\ne\nf\n_";
var re = /((?:#[^_]*_)|(?:^.*$))/mg;
var result = str.match(re);
console.log(result);
// [ '#a\nb\nc\n_', 'foo', 'bar', '#d\ne\nf\n_' ]

Объяснение регулярного выражения: соответствие - это либо все от # до _ - (?:#[^_]*_) - либо все в одной строке - (?:^.*$).

РЕДАКТИРОВАТЬ: из-за пробелов ... немного другая стратегия:

var str = $('#a').text();
var re = /^\s*((?:#[^_]*_)|(?:.*?$))/mg;
var result = [], match;
while ((match = re.exec(str))) {
  result.push(match[1]);
}
console.log(result);​
1 голос
/ 17 февраля 2012
var x = str.match(/(#?[a-z]+[0-9_]+?)/g);
0 голосов
/ 17 февраля 2012

попробуйте разделить:

arr = str.split("_");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...