2016-12-27 3 views
3

Я хотел бы получить различные разделы в моем коде с помощью регулярных выражений. Я хочу написать четыре разных выражения регулярных выражений. Первый простой, который должен захватить первую строку, которая начинается со слова extends. Следующие три должны захватить секции, обозначенные block head, block body и block scripts.Как захватить раздел с помощью регулярного выражения?

Я немного потерян. До сих пор у меня есть /^block/m

Я не хочу уважать отступы, просто используя его для своей собственной визуальной организации.

extends standard 

block head 

    <title>title</title> 
    <meta name="description" content="A wonderful thing."> 

block body 

    <h1>Title</h1> 
    <p>A wonderful paragraph...</p> 

block scripts 

    <script src="/javascritps/html5shiv.js"></script> 

Мне нужно уметь идентифицировать идентификатор после блока слов.

Кроме того, отдельно, мне нужно захватить содержимое HTML после каждого блока ____.

+1

Что вы будете делать, если HTML содержит «блок»? Вам понадобится парсер HTML. Вы не можете анализировать HTML с регулярным выражением. – Oriol

+0

Ну, блок не появится после новой строки. Я открыт для предложений по использованию парсеров. – Costa

ответ

4

У вас есть хороший старт: вот как сделать с помощью просмотра назад: /(?<=^block)\w+\n/mg

в действии здесь: https://regex101.com/r/bFhNSO/1


[EDIT] для объяснения.

Использование lookbehind - более сложный синтаксис, но позволяет вам только записывать нужное слово без слова «Block».

Тем не менее, если вы не заботитесь, или, если вы делаете это на JS вы можете сделать то же самое с:

/^block (\w+)\n/mg, то вам нужно захватить.


[EDIT] После изменения вопроса.

Так что для JS без искажений и захвата html все в одном регулярном выражении вы можете использовать что-то вроде этого: /block (\w+)\n+([\s\S]*?)(?=\s+\nblock|$)/g.

Просмотреть здесь работающий: https://regex101.com/r/bFhNSO/2.

Обратите внимание, что я изменил аромат на js в regex101.


[EDIT] добавить больше деталей.

  • Во-первых, флаг g для глобальной, так что вы можете соответствовать несколько экземпляров тот же шаблон.
  • (\w+) захватывает слово в основном как [a-z _] +, поэтому вы можете изменить его на более разрешительный в соответствии с вашими потребностями.
  • ([\s\S]*?) захватывает все, что угодно.*, который вы обычно видите, но особенно в JS, у вас нет флага s для соответствия любому знаку расстояния с ., поэтому эквивалент длинных минут [\s\S]+, соответствующий любому \s И любым NOT \s с \S. ? предназначен для жадности, то есть вы хотите взять наименьшее возможное совпадение, вы можете попробовать регулярное выражение без него, и вы поймете разницу.
  • (?=\s+\nblock|$) - это просмотр, разрешенный в JS, чтобы ваше предыдущее соответствие сопровождалось либо словом block, либо в конце документа с $.

Все, надеюсь, это поможет людям! :)

+0

Oooo фантазии. Это очень полезно. Как получить содержимое HTML в каждом разделе? Позвольте мне уточнить мой вопрос, потому что оба эти являются существенными:) – Costa

+1

ok позвольте мне выйти с этим – antoni

+0

Хм ... оглядываться назад не работает в JavaScript? – Costa

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