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

时间:2014-04-09 09:35:30

标签: c# regex pattern-matching

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

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);
   }
}

现在,我想替换"非"用户输入。我们可以说它被称为" UserInput"并且代码完美地写入以获得用户输入。我想这样做,但错误存在:

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

有没有办法取代"非"在用户输入的正则表达式模式中?

3 个答案:

答案 0 :(得分:0)

我认为你只是缺少string.Format()

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

有两部分 - 在字符串中插入用户输入并确保输入实际上在正则表达式中有用。

如果您使用的是C#6.0 +(How do I interpolate strings?),则可以使用string.Format或字符串插值轻松完成插入。

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

结果:

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

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