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

本文关键字:用户 输入 正则表达式 何替换 替换 | 更新日期: 2023-09-27 17:57:43

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

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;

有什么方法可以用用户输入替换regex模式中的"非"吗?

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

我想您只是缺少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或字符串插值轻松完成插入。

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

所以结果:

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

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