如果输入转义,C#正则表达式无法找到带空格的文本

时间:2019-05-23 09:14:26

标签: c# .net regex escaping

在尝试查找两个单词之间带有单个空格的文本时,我遇到了似乎是一个错误的东西。我正在使用类似(abc)\s(abc)的模式来查找两个特定的单词。现在,我使用Regex.Escape转义了输入,但是正则表达式不再匹配,因为空格被转义(到\space),然后不匹配。这是故意的吗?

我的文字来自用户输入,据我所知应该转义。

为澄清我的问题,以下代码:

Console.WriteLine("Original text: " + text);
Console.WriteLine("Escaped text: " + Regex.Escape(text));
Console.WriteLine("Matches non-escaped text: " + Regex.IsMatch(text, @"(abc)\s(abc)", RegexOptions.IgnoreCase));
Console.WriteLine("Matches escaped text: " + Regex.IsMatch(Regex.Escape(text), @"(abc)\s(abc)", RegexOptions.IgnoreCase));

为输入abc abc提供以下结果

  

原始文本:abc abc

     

转义字符:abc \ abc

     

匹配非转义文本:True

     

匹配转义文本:False

虽然我希望它仍然可以在空格上匹配

1 个答案:

答案 0 :(得分:1)

  

我的文字来自用户输入,据我所知应该转义。

这是一个错误的前提。如果您以此为前提,那么每次有人使用您的任何应用程序为名为Shamus A. O'Leary的员工创建记录时,他们最终可能会以Shamus A\. O\'Leary,{{1}的身份插入数据库。 },Shamus A. O'Leary等,具体取决于数据来自何处以及您如何确定需要对其进行转义

仅仅因为用户提供了文本并不意味着它需要被转义-您将不得不根据上下文应用转义,而不是根据文本的来源作为总括规则。通常,转义用于确保数据可以通过不支持所有字符的某些传输通道保存下来,或者会尝试将某些字符处理为具有特殊含义的字符,而在某些情况下则不应该使用它们。因此,与其将转义视作必须根据数据源进行的工作,还不如将其视作必须确保数据到达目标不受损害的工作

正则表达式明智的Shamus+A%2E+O'Leary由于斜杠与(abc)\s(abc)的字符串不匹配。您已经将字符串从匹配X转换为其他字符串(Y),然后询问正则表达式解析器Y是否与正则表达式匹配。它比abc\ abc匹配要好得多,它假设“ URL被转义时,空格变为加号,因此加号和空格对正则表达式必须具有相同的含义” —正则表达式引擎将只需查看数据并说“加号不是空格字符;不匹配”。 regex引擎不会查看您的数据并认为“嘿,如果我在通过模式匹配器运行它之前取消转义……”,它不会查看您的数据并认为“这是一个regex模式”-正则表达式模式表达式和从该模式传递给正则表达式匹配器的数据是非常不同的东西,如果您希望数据与所描述的模式匹配,请在确定模式后不要更改数据

因此,问题在于通过在请求匹配之前运行字符替换(转义)来转换字符串