我正在尝试用文本文件替换占位符,并使用从占位符内容构建的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}
此外 - 如果有人有更简洁的方式来执行此占位符替换,我很乐意听到它。
答案 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)
您可以将正则表达式更改为不那么贪心:{[^}]+}