我正在尝试用正则表达式在同一个字符串中处理多个不同的情况。但是当我使用下面的代码时,只有最后一个表达式才有效。所以dobbel星(**)会像它一样张贴,但下划线(_)将由replace()
函数处理。
[HttpPost]
[ValidateInput(false)]
public ActionResult Comment(Models.CommentModel s)
{
Regex fat = new Regex(@"\*\*(.*?)\*\*");
Regex italic = new Regex(@"_(.*?)_");
s.comment = fat.Replace(HttpUtility.HtmlEncode(s.comment), "<b>$1</b>");
s.comment = italic.Replace(HttpUtility.HtmlEncode(s.comment), "<i>$1</i>");
var db = new WebApplication1.Models.ApplicationDbContext();
if (ModelState.IsValid)
{
if (file != null)
{
db.Comments.Add(s);
db.SaveChanges();
return RedirectToAction("Comment");
}
return View(s);
}
为了减少代码量,我尝试将italic
和fat
字符串合并在一起,如下所示:Regex(@"\*\*(.*?)\*\*|_(.*?)_");
但是我还有另一个问题,Regex如何知道差异?
答案 0 :(得分:1)
因为你要编码相同的html 两次:
// comment : sampletext **bold** _italic_ stuffsss
s.comment = fat.Replace(HttpUtility.HtmlEncode(s.comment), "<b>$1</b>");
// comment : sampletext <b>bold</b> _italic_ stuffsss
s.comment = italic.Replace(HttpUtility.HtmlEncode(s.comment), "<i>$1</i>");
// comment : sampletext <b>bold</b> <i>italic</i> stuffsss
完成替换后,只需编码一次:
Regex fat = new Regex(@"\*\*(.*?)\*\*"); // btw this is called `bold` not `fat`
Regex italic = new Regex(@"_(.*?)_");
s.comment = HttpUtility.HtmlEncode(s.comment)
s.comment = fat.Replace(s.comment, "<b>$1</b>");
s.comment = italic.Replace(s.comment, "<i>$1</i>");