正则表达式以识别占位符

时间:2011-06-13 14:59:40

标签: c# regex string

我正在尝试用文本文件替换占位符,并使用从占位符内容构建的html元素。

例如,我有一个占位符,例如{Image, picture.jpg, Centre, Picture Info}

我想将其转换为:

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

我希望使用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 个答案:

答案 0 :(得分:3)

为每个占位符重复此部分:

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

[^,]表示“除,之外的任何字符”,因此即使greedy ,量词,也会在下一个+之前停止。这是一个trick for processing speed。更明显的替代方案是使用lazy (a.k.a. ungreedy, reluctant) quantifier

(?:…)non-capturing group - 无法使用$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);

答案 1 :(得分:2)

你正在寻找一个“不合适的比赛”(注意?),基本上。以下内容:

/\{(.*?)\}/

在大括号内可以匹配尽可能少的字符。从那里,您将需要抓取内容并根据您对格式应遵循的方式进行解析。

如果您只是寻找图像,当然也可以指定图像:

/\{Image (.*?)\}/

答案 2 :(得分:1)

我想你只想要\{[^{}\n\r]+}

在其中添加了\n\r,因此在随机{上不会失控太多。

答案 3 :(得分:1)

您可以将正则表达式更改为不那么贪心:{[^}]+}