2013-02-22 2 views
0

Я пытаюсь создать регулярное выражение (ruby), которое проверяет наличие нескольких условий. Я использую это регулярное выражение для замены содержимого моего объекта. Мое регулярное выражение близко к завершению, за исключением двух проблем, с которыми я сталкиваюсь в отношении уценки.Regex Markdown Header

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

Hi John <== # should not change 
================== 

Текст: Привет, как ты? < == # Должно быть: Привет, как дела? после подстановки

Или:

#### Hi Peter <== # should not change 

Текст: Привет, как ты? < == # Должно быть: Привет, как дела? после подстановки

Вопрос: Как я могу избежать уценки заголовки внутри моего регулярного выражения? Я пробовал негативные взгляды и взгляды, но безуспешно.

Моя вторая проблема должна быть довольно простой, но как-то я борюсь. Если слова Italic «привет« Я хочу их найти и заменить, не меняя подчеркивания. Я могу найти слово с этим регулярным выражением:

\b[_]*hi[_]*\b 

Вопрос 2: Но если бы я заменить его, я бы также изменить подчеркивание. Есть ли способ определить только само слово и заменить его, сохраняя при этом границы слов?

Пример кода

@website.autolinks.all.each do |autolink| 
    autolink.name #for example returns "Iphone5" 
    autolink.url #for example returns "http://www.apple.com" 

    regex = /\b(?<!##\s)(?<![\d.\[])([_]*)#{autolink.name}([_]*)(?![\d'"<\/a>])\b/ 

    if @permalink.blog_entry.content.match(regex) 
    @permalink.blog_entry.content.gsub!(regex, "[#{autolink.name}](# {autolink.url})") 
    end 
end 

Пример текста

Iphone5 
============== 

iPhone5 это лучший мобильный телефон есть, даже если люди на Samsung, вероятно, думают, или, возможно, только надеяться, что их Samsung Galaxy S3 лучше.

#### Samsung Galaxy S3? 

Да, это название нового Samsung телефона.

Это приведет к тексту с тегами HTML, но когда я использую свое регулярное выражение, в моем контенте используется синтаксис Markdown (используемый до конвертера меток).

+0

есть что-то в заголовке вообще, что вы хотите изменить? – VladL

+0

Нет, я хочу только заменить определенные слова в тексте ссылками. Заголовки должны оставаться нетронутыми. Я попытался добавить (?

+0

Отправляете ли вы этот документ в HTML - если да, то как насчет поиска и замены в HTML? Вы можете легко запустить его на всех элементах абзаца, что исключает заголовки. –

ответ

0

Я нашел решение:

regex = /(?<!##\s)(?<![\d.\[a-z])#{autolink.name}(?![\d'"a-z<\/a>])(?!.*\n(==|--))/i 

    if @permalink.blog_entry.content.match(regex) 
     @permalink.blog_entry.content.gsub!(regex, "[\\0](#{autolink.url})") 
    end 
0

Регуляторы работают лучше всего, когда они делают одну ясную вещь. Если у вас несколько условий, ваш код обычно должен отражать это, деля процесс обработки на этапы.

В этом случае, у вас есть две четкие шаги:

  1. Использование простого регулярного выражения или другую логику, чтобы пропустить часть заголовка сообщения.
  2. Как только вы знаете, что используете контент, используйте другое регулярное выражение для обработки содержимого.
+0

Но что, если у вас есть такой текст: «HEADER Content SUBHEADER Content» в том же объекте.content. Теоретически заголовки могут возникать повсюду внутри контента. Они не обязательно находятся в другом атрибуте, таком как object.title. –

+0

@PeterdeRidder, вы все равно можете использовать одно регулярное выражение для определения того, что не является заголовком, а затем другим регулярным выражением для обработки частей контента. Если у вас есть вопросы об особенностях его реализации, обновите свой вопрос с более ясного примера того, как выглядят ваши данные, а также образец кода, который вы используете. – 2013-02-22 14:31:58

+0

Я просто добавил пример кода. –

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