Разбить строковые данные в массив на основе новой строки, а затем двузначный номер - PullRequest
3 голосов
/ 19 июня 2010

Я собираюсь разбить данные из строки на массив.

Вот общая идея текстового формата ...

xxxxx обозначает любое сочетание буквенно-цифровых данных и пробелов.

xxxxx
 1 xxxxxxxxxx
 2 xxxxxxxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxxxx
 3 xxxxxxxxxx
 4 xxxxxxxxxx
xxxxxxxxxx
 5 xxxxxxxxxx

(Когда числа попадают в двузначные числа, место десятки переходит в пустую позицию перед числом)

Теперь я хочу иметь массив из 5 элементов (в данном случае), в котором хранится число и все данные, которые следуют (включая новые строки). В прошлом это не было большим делом, и я мог использовать string.split("\n"), но теперь мне нужно разделить на основе некоторого регулярного выражения, например /\n [0-9]{1,2}/, поэтому я ищу быстрый и простой способ сделать это (как разделение () не поддерживает регулярные выражения).

Я хочу, чтобы массив был похож на

array[1] = " 1 xxxxxxxxxx"
array[2] = " 2 xxxxxxxxxxx\nxxxxxxxxxx\nxxxxxxxxxx"
array[3] = " 3 xxxxxxxxxx"
...etc

Ответы [ 3 ]

5 голосов
/ 19 июня 2010

split() поддерживает регулярные выражения. Попробуйте это:

text.split(/\n(?=[1-9 ][0-9] )/)
2 голосов
/ 19 июня 2010

Вы можете использовать lookahead и split для (?= [1-9] |[1-9][0-9] ), возможно, с привязкой в ​​начале строки, но могут быть проблемы с неясностями в части xxxx. Это также не гарантирует, что нумерация последовательная.

Пример

var text =
  "preface\n" +
  " 1 intro\n" +
  " 2 body\n" +
  "more body\n" +
  " 3 stuff\n" +
  "more stuff\n" +
  "even 4 stuff\n" +
  "10 conclusion\n" +
  "13 appendix\n";

print(text.split(/^(?= [1-9] |[1-9][0-9] )/m));

Вывод ( как видно на ideone.com ):

preface
, 1 intro
, 2 body
more body
, 3 stuff
more stuff
even 4 stuff
,10 conclusion
,13 appendix
1 голос
/ 19 июня 2010

Как сказал @polygenelubricants, вы можете использовать регулярное выражение с заменой и создать временный разделитель, а затем разделить этот разделитель и удалить его.

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

function SplitCrazyString(str) {
    var regex = /(\n\s?\d+\s[^(\n\s?\d+)]+)/mg;

    var tempStr = str.replace(regex, "~$1");

    var ary = tempStr.split('~');

    for (var i = 0; i < ary.length; i++) {
        ary[i].replace('~', '');
    }

    return ary;
}
var x = "xxxxx\n" +
    " 1 xxxxxxxxxx\n" +
    " 2 xxxxxxxxxx\n" +
    "xxxxxxxxx\n" +
    "xxxxxxxxx\n" +
    "xxxxxxxx\n" +
    " 3 xxxxxxxxxx\n" +
    " 4 xxxxxxxxxx\n" +
    "xxxxxxxxxx\n" +
    " 5 xxxxxxxxxx\n";
var testStr = "6daf sdf84 as96\n" +
    " 1 sfs 4a8dfa sf4asf\n" +
    " 2 s85 d418 df4 89 f8f\n" +
    "65a1 sdfa48 asdf61\n" +
    "w1c 987a w1ec\n" +
    "a6s85 d1a6f 81sf\n" +
    " 3 woi567 34ewn23 5cwe6\n" +
    " 4 s6k 8hf6 9gd\n" +
    "axxm4x1 dsf615g9 8asdf1jt gsdf8as\n" +
    " 5 n389h c8j923hdha 8h3x982qh\n";

var xAry = SplitCrazyString(x);
var testAry = SplitCrazyString(testStr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...