如何在正则表达式中替换用户输入?

我将使用简单的代码来描述我的情况。 例如,以下是代码:

using System; using System.Text.RegularExpressions; public class Example { public static void Main() { string pattern = @"\b(?!non)\w+\b"; string input = "Nonsense is not always non-functional."; foreach (Match match in Regex.Matches(input, pattern, RegexOptions.IgnoreCase)) Console.WriteLine(match.Value); } } 

现在,我想用用户输入替换“non”。 假设它被称为“UserInput”,并且代码被完美地写入以获得用户输入。 我想这样做,但错误存在:

 string pattern = @"\b(?!{0})\w+\b", UserInput; 

有没有办法用用户输入替换正则表达式模式中的“非”?

我想你只是缺少string.Format()

 string pattern = string.Format(@"\b(?!{0})\w+\b", UserInput); 

要在另一个字符串中插入字符串,您可以使用:

 string userInput = "some text"; string originalText = @"\b(?!})\w+\b"; string newText = originalText.Insert(5, userInput); 

有两个部分 – 在一个字符串中插入用户的输入,并确保输入实际上将在正则表达式中工作。

如果使用C#6.0+( 如何插入字符串? ),可以使用string.Format或字符串插值轻松完成插入。

现在在第二部分 – 如果用户输入“。 ”并且你盲目地将它插入到正则表达式中它将匹配所有字符串而不仅仅是“。 ”。 要正确处理它,请使用正则 表达式中的Escape特殊字符中所示的Regex.Escape 。

结果如下:

  var pattern = String.Format(@"\b(?!{0})\w+\b", Regex.Escape(userInput)); 

请注意,如果userInput实际上应该包含正则表达式(例如“。”应匹配任何字符),则不应该转义输入,但它可能导致无限制的执行时间,因为用户可以提供永久占用的流氓正则表达式。 只有在信任所有用户不试图破坏系统的情况下,才将其视为一种选择。