【问题标题】:Replace string which contains curly braces替换包含大括号的字符串
【发布时间】:2017-08-04 20:04:43
【问题描述】:

我有一个类似

的声明
    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

我想用"TestString" 替换"The {0} must be at least {2} characters long."。 目前我正在使用 Regex.Replace,但它不起作用。 例如

string lno = "[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]";
pattern = "The {0} must be at least {2} characters long.";
string _name = Regex.Replace(lno, pattern, "TestString", RegexOptions.None);

请帮忙。

编辑: 我正在解析一个类的每一行(使用 Visual Studio shell 包),并在找到时尝试替换提到的字符串。我将行号值存储到“lno”中。这就是为什么我在这里这样初始化它。 它适用于正常的字符串,例如:

[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]

问题仅在于它解析带有花括号的字符串时。

谢谢。

【问题讨论】:

  • 首先,您需要使用 \ 转义 lno 字符串中的双引号。然后你可以只使用string.Replace 或者你还需要在你的正则表达式中分隔花括号。
  • 你想在这里做什么?您不能使用代码“更改”消息 - 它的元数据,并且必须在编译时知道。
  • @StephenMuecke 我已经编辑了我的问题。

标签: c# .net regex asp.net-mvc powershell


【解决方案1】:

定义正则表达式模式时必须小心。 {}. 等字符在您的表达式中仅举几例,具有特殊含义,需要转义。

var lno = "[StringLength(100, ErrorMessage = \"The {0} must be at least {2} characters long.\", MinimumLength = 6)]";
var pattern = @"The \{0\} must be at least \{2\} characters long\."; // Don't forget the @
string _name = Regex.Replace(lno, pattern, "TestString", RegexOptions.None);

小提琴 https://dotnetfiddle.net/var2Fj

【讨论】:

  • 非常感谢。但是我怎样才能动态逃脱呢?
  • 什么是动态的?
【解决方案2】:

没有必要使用正则表达式来完成你想要完成的事情..

string lno = "[StringLength(100, ErrorMessage = \"The {0} must be at least {2} characters long.\", MinimumLength = 6)]";
string pattern = "The {0} must be at least {2} characters long.";
string _name = lno.Replace(pattern, "TestString");

【讨论】:

    【解决方案3】:

    您可以使用Regex.Escape 方法对字符串进行转义:

    string lno = "[StringLength(100, ErrorMessage = \"The {0} must be at least {2} characters long.\", MinimumLength = 6)]";
    string pattern = Regex.Escape("The {0} must be at least {2} characters long.");
    string _name = Regex.Replace(lno, pattern, "TestString", RegexOptions.None);
    

    来自 MSDN:

    通过将一组最小字符(\、*、+、?、|、{、[、(,)、^、$、.、# 和空格)替换为它们的转义码来转义它们。这指示正则表达式引擎按字面意思解释这些字符,而不是元字符。

    【讨论】: