2015-11-03 3 views
0

Я пытаюсь разобрать документ, который выглядит примерно так ...Как бы один разобрать схему, где порядок сохраняется

<line>(a) main category</line> 
<line>(1) sublime</line> 
<line>(i) sub sub line</line> 
<line>(b) other category </line> 

Я не уверен, как обеспечить такие вещи, как я римскую против I письмо. Это похоже на то, что для этого должна быть библиотека или шаблон, но я не могу найти ее.

Может ли кто-нибудь подумать о шаблоне? Я хотел бы использовать js, но я довольно язык агностик.

+0

Ну, шаблон, который я вижу здесь, состоит в том, что он должен быть заключен в скобки «()». Простое регулярное выражение может помочь вам там –

+0

Согласен, и я уже фиксирую эту информацию. Я беспокоюсь о порядке, получая 1, и я подключился к a – Jackie

+0

А, правильно. Я бы определил метод, который проверяет «типы», чтобы вы могли видеть, будет ли уровень тем же или глубже - что-то вроде; if ('a' - это тот же уровень, что и «i»), где уровень «одинаковый» будет методом, который проверяет «число = то же (1, 2, 4 и т. д.), abcdefg одинаково, i, ii , iii vi, v iv - то же самое ". Но вы столкнетесь с проблемой, как только b c дойдет до h i j k .. Или V .. Или M .. Хм. Если вы не отслеживаете историю - зная, что «i» после «b» должно быть на уровне глубже, а «i» после «h» не должно быть. Вы понимаете, что я имею в виду? Извините, о чем я подумал –

ответ

-1

Поймайте содержание линии

var letter = (line.match(/^\s*\(.{1,2})\)/) || [''])[0] 
+0

Это не поддерживает порядок, например, как я знаю, что 1 идет с a или b – Jackie

+0

Что вы хотите точно? –

+0

Мне нужно организовать его таким образом, что у меня есть коллекция json-объекта (просто для простоты), что в этом случае коллекция будет иметь два элемента a и b. Внутри будет объект 1 внутри 1, будет объект I и т. Д. Мне нужен не только индикатор, как вы это сделали – Jackie

1

Loop через каждую линию, и проверить текущий «заголовок» с предыдущими.

Создайте метод, который выглядит примерно так (недействительный JS, просто псевдокод);

function isSameType(last, current) { 
    if (typeof last == 'numeric' && typeof current == 'numeric') { 
     return true; // 1, 2, 3, 4 etc. 
    } 
    if (last == 'a' && current == 'b') { //Improve here ;p 
     return true; 
    } 
    if (last == 'i' && current == 'ii') { 
     return true; 
    } 
    if (last == 'h' && current == 'i') { 
     return true; // This is an edgecase... Most likely I after H is the same type - but it might not be, you'll never know for sure 
    } 
    return false; //Its not caught - go deepar! 
} 

так с этой разметке вы будете иметь что-то, что вроде работает, но не является полностью водонепроницаемым ...

EDIT: Если это вся информация - вы можете просто остановить поиск, потому что его невозможно знаете, если I после H на самом деле уровень глубже или нет. Это просто невозможно.

РЕДАКТИРОВАТЬ 2: Пока он находится в формате A -> 1 -> I, он должен работать.

a. LEVEL 0 
b. LEVEL 0 
c. LEVEL 0 
1. LEVEL 1 
2. LEVEL 1 
i. LEVEL 2 
ii. LEVEL 2 
3. LEVEL 1 
i. LEVEL 2 
e. LEVEL 0 <- this might be an issue - say the letter is V, you wouldn't know if it was level 1 alphabetical or roman (level 2) - Or maybe they went to "a" - in that case its probably level 3, and not level 1, because the A was already there in level 1. A lot of rules! 

С правильным набором правил вы получите далеко. Но если они перескочат с уровня 3 (iv) до уровня 1 (v), вы можете столкнуться с проблемой. Но до сих пор, если вы видите «v», а предыдущий уровень был числовым (3), то он должен быть римским.

+0

К сожалению, реальные данные имеют много i (я) – Jackie

+1

Хмм, пока вложенность идет от A -> 1 -> I, то вы можете понять это наверняка. Это означает, что я после A больше _ глубже, потому что между ними должен быть цифровой уровень. –

+0

Я думаю, это было бы правдой, хм-м не думал об этом таким образом – Jackie