3

我有一个 C# 正则表达式

[\"\'\\/]+

如果在字符串中找到某些特殊字符,我想用它来评估和返回错误。

我的测试字符串是:

\test

我调用了这个方法来验证字符串:

public static bool validateComments(string input, out string errorString)
{
    errorString = null;
    bool result;

    result = !Regex.IsMatch(input, "[\"\'\\/]+");  // result is true if no match
                                                   // return an error if match

    if (result == false)
        errorString = "Comments cannot contain quotes (double or single) or slashes.";

    return result;
}

但是,我无法匹配反斜杠。我尝试了几种工具,例如正则表达式和 VS2012 扩展,它们似乎都可以很好地匹配这个正则表达式,但 C# 代码本身不会。我确实意识到 C# 正在转义来自 Javascript Ajax 调用的字符串,那么还有另一种方法来匹配这个字符串吗?

它确实匹配 /test 或 'test 或 "test,只是不匹配 \test

4

4 回答 4

7

\甚至被 Regex(es) 使用。尝试"[\"\'\\\\/]+"(所以双重逃避\

请注意,您可以使用@"[""'\\/]+" 并且可能更具可读性:-) (通过使用@您必须转义的唯一字符是", 通过使用第二个""

您实际上并不需要+,因为最终的[...]意思是“一个”,对您来说就足够了。

不要吃你不能咀嚼的东西......而不是正则表达式使用

// result is true if no match
result = input.IndexOfAny(new[] { '"', '\'', '\\', '/' }) == -1;  

我认为没有人因为他更喜欢IndexOf而不是正则表达式而丢失了工作:-)

于 2013-09-11T13:09:16.990 回答
3

您可以通过像这样逐字制作字符串来解决这个问题@

result = !Regex.IsMatch(input, @"[\""\'\\/]+");
于 2013-09-11T13:11:01.000 回答
2

由于反斜杠在正则表达式本身内部用作转义符,因此我发现在使用正则表达式库时最好使用逐字字符串:

string input = @"\test";
bool result = !Regex.IsMatch(input, @"[""'\\]+");
//                                     ^^
// You need to double the double-quotes when working with verbatim strings;
// All other characters, including backslashes, remain unchanged.
if (!result) {
    Console.WriteLine("Comments cannot contain quotes (double or single) or slashes.");
}

唯一的问题是您必须将双引号加倍(具有讽刺意味的是,在您的情况下,您需要这样做)。

ideone 上的演示

于 2013-09-11T13:14:45.943 回答
0

对于微不足道的情况,我可以使用 regexhero.net 来使用简单的测试表达式:

\\

验证

\test

RegExHero 生成的代码:

string strRegex = @"\\";

RegexOptions myRegexOptions = RegexOptions.IgnoreCase;
Regex myRegex = new Regex(strRegex, myRegexOptions);
string strTargetString = @"\test";
foreach (Match myMatch in myRegex.Matches(strTargetString))
{
  if (myMatch.Success)
  {
    // Add your code here
  }
}
于 2013-09-11T13:11:03.777 回答