我的数据库中的字段中包含以下文本:
[quote:5a7b87febe="mr smith"]This is some text.
This is more text on another line.[/quote:5a7b87febe]
Run Code Online (Sandbox Code Playgroud)
我正在尝试构建一个正则表达式,将上述任何实例转换为:
<div><h4>Posted by mr smith</h4>This is some text.
This is more text on another line.</div>
Run Code Online (Sandbox Code Playgroud)
到目前为止我放在一起的模式似乎适用于所附文本中没有换行的情况,但在上面的示例中,另一行上有文本,模式不匹配.
到目前为止我的C#代码是:
var exp = new Regex(@"(\[quote)(:\w+=\"")(.*?)(\""\])(.*?)(\[\/quote)(:\w+\])");
var str = exp.Replace(str, "<div><h4>Posted by $3</h4>$5</div>");
Run Code Online (Sandbox Code Playgroud)
我在正则表达式上很垃圾,所以我不确定如何处理打开和关闭'quote'标签之间出现的"任何"字符.
理想情况下,如果可能的话,我还希望表达式处理上面示例的嵌套实例.
值得一提的另一件事是,"quote:"标签后面的一系列字符每次都是唯一的,引号内的名称也会有所不同.
您需要使用反向引用来匹配开始标记中的唯一编号.这样的事情对你有用:
var regex = new Regex(@"\[(quote:[a-z0-9]+)(=""([^""]+)?"")?\](.*)\[/\1\]", RegexOptions.SingleLine);
var str = regex.Replace(str, "<div><h4>Posted by $3</h4>$4</div>");
Run Code Online (Sandbox Code Playgroud)
此解决方案已使用您的输入进行测试,但未使用嵌套引号进行测试.这会有点棘手.
编辑:使用嵌套引号检查此解决方案后,它确实有效.您只需重复调用它,直到不再进行替换.第一次它将匹配外部报价并在更换内部保留内部报价.这样做的示例代码(未经测试):
// Repeatedly call this replacement
string last;
do
{
last = str;
str = regex.Replace(str, "<div><h4>Posted by $3</h4>$4</div>");
} while (last != str);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
263 次 |
| 最近记录: |