Javascript - анализировать форматированный текст и извлекать значения в порядке? - PullRequest
0 голосов
/ 15 декабря 2011

У меня есть поле с рендерингом в вики-стиле, которое я хотел бы добавить в Javascript.

Текст, который я пытаюсь разобрать, выглядит так:

{color:#47B}_name1_{color}
{color:#555}description1{color} 
---
{color:#47B}_name2_{color}
{color:#555}description2{color} 
---
{color:#47B}_name3_{color}
{color:#555}description3{color} 
---
etc

Если name1 и description1 принадлежат друг другу, name2 и description2 принадлежат друг другу и т. Д. Значения для имени и описания являются пользовательскими значениями, описание которых может занимать несколько строк.

Моя конечная цель - уметь извлекать значения каждого имени и каждого описания из текста (и иметь возможность надежно связывать имя1 с описанием1 и т. Д.).

Мой вопрос: если я использовал регулярное выражение для сопоставления всех имен в массиве и всех описаний в массиве, могу ли я быть уверен, что элементы в массиве находятся в правильном порядке? То есть имена [0] всегда будут первым именем в разобранном тексте (при условии, что я сделал регулярное выражение javascript match в массив имен)? Также - это плохая практика / я должен сделать это по-другому?

Регулярное выражение, которое я пытаюсь использовать для сопоставления имен:

/^(\{color\:#47B\})(_)(\s*?)(.*?)(\s*?)(_)(\{color\})$/

И регулярное выражение, которое я использую для сопоставления описаний:

/(\{color\:#555\})(.*?)(\{color\})/

1 Ответ

1 голос
/ 15 декабря 2011

Поиск по регулярному выражению всегда будет возвращать совпадения в исходном порядке (т. Е. В том порядке, в котором они встречаются в исходном тексте).

Я предполагаю, что вы задаете этот вопрос, потому что вы надеетесь сделать два регулярных выражениясовпадает (один для имени, другой для описания), а затем получает два массива результатов и гарантирует, что namesmatch[i] всегда идет с descriptionmatch[i].Тем не менее, это будет верно только в том случае, если ваш исходный текст всегда точно совершенен.

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

Примечание о ваших регулярных выражениях.Символ . не соответствует символу новой строки, поэтому, если текст между скобками {color} может содержать символ новой строки, вам необходимо явно включить символы новой строки.[\s\S] это общая идиома для этого.

...