坚持使用 C# 正则表达式
本文关键字:正则表达式 坚持 | 更新日期: 2023-09-27 18:37:12
>我的数据库的一个字段中包含以下文本:
[quote:5a7b87febe="mr smith"]This is some text.
This is more text on another line.[/quote:5a7b87febe]
我正在尝试构造一个正则表达式,它将上述任何实例转换为:
<div><h4>Posted by mr smith</h4>This is some text.
This is more text on another line.</div>
到目前为止,我整理的模式似乎适用于随附文本中没有换行符的情况,但在上面的示例中,另一行上有文本,该模式不匹配。
到目前为止,我拥有的 C# 代码是:
var exp = new Regex(@"('[quote)(:'w+='"")(.*?)('""'])(.*?)('['/quote)(:'w+'])");
var str = exp.Replace(str, "<div><h4>Posted by $3</h4>$5</div>");
我对正则表达式很垃圾,所以不确定如何处理出现在开始和结束"引号"标签之间的"任何"字符。
理想情况下,如果可能的话,我还希望表达式处理上述示例的嵌套实例。
另一件值得一提的事情是,"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>");
此解决方案已使用您的输入进行了测试,但未使用嵌套引号进行测试。 这会有点棘手。
编辑:使用嵌套引号检查此解决方案后,它确实有效。 您只需要反复调用它,直到不再进行替换。 第一次它将匹配外部引号,并在替换中保持内部引号不变。 执行此操作的示例代码(未经测试):
// Repeatedly call this replacement
string last;
do
{
last = str;
str = regex.Replace(str, "<div><h4>Posted by $3</h4>$4</div>");
} while (last != str);