Регулярное выражение для определения заполнителей - PullRequest
2 голосов
/ 13 июня 2011

Я пытаюсь заменить заполнители в текстовом файле элементами html, созданными из содержимого заполнителя.

Так, например, у меня есть заполнитель, такой как {Image, picture.jpg, Centre, Picture Info}

Я хочу преобразовать это в:

<img src="urltopicture\picture.jpg" alt="Picture Info" class="quipImgCentre"></img>

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

Regex {. *} Работает там, где в строке есть только один заполнитель, но не более, чем один - в тексте ниже он вернется в качестве одного длинного заполнителя, все от первого открытия "{" до последний "}".

 Aenean non felis at est gravida tincidunt. {Link, news.bbc.co.uk, popup, 500, 800} Donec non diam a mauris vestibulum condimentum eu vitae mi! Aenean sed elit libero, id mollis felis! {Image, ServiceTile.jpg, Left}

Кроме того - если у кого-то есть более аккуратный способ замены заполнителя, я бы хотел это услышать.

Ответы [ 4 ]

3 голосов
/ 13 июня 2011

Повторите эту часть для каждого из ваших заполнителей:

Regex PlaceholderExpander = new Regex(@"\{Image, ([^,]+), ([^,]+)(?:, ([^}]+))?\}");
string Expanded = PlaceholderExpander.Replace(YourHtmlStringWithPlaceholders, "<img src='$1' alt='$3' class='quipImg$2'></img>");

[^,] означает «любой символ, кроме ,», поэтому останавливается перед следующим ,, несмотря на жадный + квантификатор. Это трюк для скорости обработки . Более очевидной альтернативой будет использование lazy (a.k.a. ungreedy , recuctant ) .

(?:…) является не захватывающей группой - на нее нельзя ссылаться с чем-то вроде $3. Я использовал его, чтобы охватить часть, принадлежащую необязательному последнему параметру - он стал необязательным с последним ?.

Теперь я сделал последний параметр необязательным, поэтому он поддерживает оба

{Image, picture.jpg, Centre, Picture Info}

и

{Image, ServiceTile.jpg, Left}

последний в результате

<img src='ServiceTile.jpg' alt='' class='quipImgLeft'></img>

Я проверял это в http://rextester.com/rundotnet с этим кодом:

string YourHtmlStringWithPlaceholders = "Aenean {Image, picture.jpg, Centre, Picture Info} non felis at est gravida tincidunt. {Link, news.bbc.co.uk, popup, 500, 800} Donec non diam a mauris vestibulum condimentum eu vitae mi! Aenean sed elit libero, id mollis felis! {Image, ServiceTile.jpg, Left}";

Regex PlaceholderExpander = new Regex(@"\{Image, ([^,]+), ([^,]+)(?:, ([^}]+))?\}");
string Expanded = PlaceholderExpander.Replace(YourHtmlStringWithPlaceholders,"<img src='$1' alt='$3' class='quipImg$2'></img>");

Console.WriteLine(Expanded);
2 голосов
/ 13 июня 2011

Вы ищете "несгибаемый матч" (обратите внимание на ?), в основном. Следующее:

/\{(.*?)\}/

Будет соответствовать как можно меньшему числу символов в фигурных скобках. Оттуда вам нужно будет взять содержимое и проанализировать в соответствии с вашими представлениями о формате.

Если вы ищете только изображения, вы, конечно, можете указать и это:

/\{Image (.*?)\}/
1 голос
/ 13 июня 2011

Вы можете изменить регулярное выражение на менее жадное: {[^}]+}

1 голос
/ 13 июня 2011

Полагаю, вы просто хотите что-то вроде \{[^{}\n\r]+}.

Добавил туда \n\r, чтобы он не убегал слишком много случайным образом {.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...