Строка захвата RegEx, которая имеет новую строку до первого экземпляра (набора) символов

Я пытаюсь получить первый экземпляр строки в следующей исходной строке

Строка ввода

 ><text color="#FFFF00" creationdate="D:20180307100631+04'00'" flags="print,nozoom,norotate" date="D:20180307100652+04'00'" name="a60915a3-1c23-4f6d-b8d4-fbe0dd4890e9" icon="Comment" page="7" rect="351.308000,135.732000,371.308000,153.732000" subject="Sticky Note" title="saddia"
><contents-richtext
><body xmlns="http://www.w3.org/1999/xhtml" xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/" xfa:APIVersion="Acrobat:9.0.0" xfa:spec="2.0.2"
><p dir="ltr"
><span dir="ltr" style="font-size:10.0pt;text-align:left;color:#000000;font-weight:normal;font-style:normal"
>As agreed with WPO that any unspecific area use GEN</span
><span dir="ltr" style="font-size:11.0pt;text-align:left;color:#1D477B;font-weight:normal;font-style:normal"
>&#xD;</span
><span dir="ltr" style="font-size:11.0pt;text-align:left;color:#000000;font-weight:normal;font-style:normal"
>&#xD;</span

Я пытаюсь получить вывод, как показано ниже

page="7" rect="351.308000,135.732000,371.308000,153.732000" subject="Sticky Note" title="saddia"
><contents-richtext
><body xmlns="http://www.w3.org/1999/xhtml" xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/" xfa:APIVersion="Acrobat:9.0.0" xfa:spec="2.0.2"
><p dir="ltr"
><span dir="ltr" style="font-size:10.0pt;text-align:left;color:#000000;font-weight:normal;font-style:normal"
>As agreed with WPO that any unspecific area use GEN</span

что до первого экземпляра </span,

Мой RegExp, как показано ниже, выбирает последнее вхождение желаемой конечной группы символов:

page="[0-9]+".+subject="(Text Box|Sticky Note)".+((\s+.+)+);<\/span

У меня ограниченные знания о RegEx, поэтому, пожалуйста, потерпите меня.

Фрагмент выводится в формате XFDF (экспорт комментариев в формате PDF), но его форматирование было странным, поэтому я использовал теги html для форматирования.

1 ответ

Решение

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

page="[0-9]+".+?subject="(?:Text Box|Sticky Note)".+?<\/span

демонстрация

Обратите внимание, что для того, чтобы вышеприведенный шаблон работал, регулярное выражение должно выполняться в режиме DOT ALL, что означает, что точка также совпадает с новой строкой.

В VBA, который не имеет формального режима DOT ALL, мы можем смоделировать его, используя [\s\S]:

page="[0-9]+"[\s\S]+?subject="(?:Text Box|Sticky Note)"[\s\S]+?<\/span
Другие вопросы по тегам