В течение всего этого дня я бился головой об стену и приближаюсь к этому. В поисках свежей перспективы.
Образец входного текста:
(разрывы строк добавлены для ясности, а не в реальных данных)
</div>#My Novel<br />
##Chapter1<br />
It was a dark and stormy night<br />
##Chapter 2<br />
The End
Желаемый выход
</div><h1>My Novel</h1><br />
<h1>Chapter1</h1><br />
It was a dark and stormy night<br />
<h1>Chapter 2</h1><br />
The End
Фактический объем производства
</div><h1>My Novel</h1><br />
##Chapter1<br />
It was a dark and stormy night<br />
<h1>Chapter 2</h1><br />
The End
Вот выражение совпадения
(отформатировано для удобства чтения, комментарии / переносы строк не выражены)
(?<preamble>
(
([<]\/\w+\d*[>])|([<]\w+\d*\s*\/[>]) #</tag> or <tag />
)
\s* #optional whitespace
)
(?<hashmarks>
\#{1,6} #1-6 hash marks
)
(?<content>
.+? #header content
)
(?<closing>
([<](br|\/\s*br|br\s*\/)[>]) #<br>,</br>, or <br />
)
Вот выражение для замены
${preamble}<h1>${content}</h1>${closing}
Если это имеет значение, я использую следующую C # regex.replace overload:
Regex.Replace(Source,SrchExp,ReplExpr,RegexOptions.IgnoreCase)
Вопрос (наконец)
Кто-нибудь может понять, почему он заменяет #My Novel и ## Chapter 2, но не ## Chapter 1?
Извините за длинный пост, и, надеюсь, я ничего не пытался отформатировать, чтобы сделать его читаемым для SO.
Обновление:
Еще одна вещь, которая может помочь. Добавление дополнительного тега разрыва сразу после «Романа» заставляет приведенный код начать работать отлично. Понятия не имею почему.
Образец входного текста (изменен):
</div>#My Novel<br /><br />
##Chapter1<br />
It was a dark and stormy night<br />
##Chapter 2<br />
The End