如何替换正则表达式中的用户输入
本文关键字:用户 输入 正则表达式 何替换 替换 | 更新日期: 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
实际上应该包含正则表达式(如"."应该匹配任何字符),则不应该转义输入,但这可能会导致无限制的执行时间,因为用户可能会提供耗时很长的流氓正则表达式。只有在所有用户都被信任不会试图破坏系统的情况下,才将其视为一种选择。