2015-06-30 2 views
0

Я пытаюсь написать Markdown Parser ontop плагина LDT JavaScript, который позволяет сортировать в реальном времени синтаксический анализ. Он имеет базовые функции, и один из них - это настраиваемый парсер, который использует Regex.Регулярное выражение соответствует этому или точно этому

При попытке реализовать «парсер» Markdown, я застрял в списках. Я хочу, чтобы соответствовать

- This string 
* and that string 

Или точно

1. A string that starts with a number whic must be followed by a period. 

Таким образом, при создании синтаксического анализа, все записи concationated и разделены с трубой (|). Шаблон: new Regexp("^("+s+")$").

Мой текущий Regex чтобы соответствовать неупорядоченных списков:

/[-\*]\s[^\n\r]*\n?/ 

... но это также соответствует в центре линии.

Какое регулярное выражение соответствует - или * префиксным строкам, или цифрам с префиксом строк, но который должен иметь период?

+1

Почему не дают нам свой вход и выход нужного для краткости? : D – hungndv

+1

Regex не рекомендуется для синтаксического анализа. Регулярное выражение представляет собой небольшой шаблонный движок. На этот вопрос можно ответить, но в конечном итоге разбор Markdown с помощью Regex, вероятно, не лучший выбор. –

+0

Это работает: ['/^([-*]|\d\.)\s(.*)$/gm'](https://regex101.com/r/fL5tK4/2) – Sam

ответ

2

Избегайте обсуждения, если это правильный/неправильный способ приблизиться к желаемой задаче, вы можете использовать два group captures and beginning/end line boundaries. Первый захват группы позволит вам проверить, какой тип списка он имеет, если есть совпадение.

var strings = [ 
 
    '- This string', 
 
    '* and that string', 
 
    '1. A string that starts with a number which must be followed by a period.', 
 
    'Bad string', 
 
    '-Bad string', 
 
    '*Bad string', 
 
    '2 Bad string.' 
 
]; 
 

 
var matchRegExp = /^(\d\.|\*|\-)\s(.+)$/; 
 

 
var res = strings.map(function (str) { 
 
    return { str: str, match: str.match(matchRegExp) }; 
 
}); 
 

 
document.write('<pre>' + JSON.stringify(res, null, 4) + '</pre>');

+0

+1, но пара примечаний для придирчивой: 1). '-' не нужно экранировать вне класса символов (и даже не нужно экранировать в качестве первого/последнего символа в классе), 2). '\ * | \ -' может быть сокращено до' [* -] ', 3). конечный '$' может быть хорошим для удобочитаемости, но не нужен, когда заканчивается жадным символом dot-match-all. – Sam

+0

@Sam Согласен, но я собирался для чтения по соображениям стиля/перформанса –

+0

@Sam Хорошо знать, спасибо! –

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