C# regex 不允许正确使用特殊字符?

C# regex does not allow special characters correctly?

例如我有以下字符串:

thats a\n\ntest\nwith multiline \n\nthings...

我尝试使用以下代码,但它无法正常工作并且仍然没有包含所有字符:

string text = "thats a\n\ntest\nwith multiline \n\nthings and so on";
var res = Regex.IsMatch(text, @"^([a-zA-Z0-9äöüÄÖÜß\-|()[\]/%'<>_?!=,*. ':;#+\])+$");
Console.WriteLine(res);

我希望正则表达式在 only 包含以下字符时返回 true(不必包含所有字符,但至少包含以下字符之一,而不包含其他字符): a-zA-Z0-9äüöÄÖÜß!#'-.:,; ^"§$%&/()=?\}][{³²°*+~'_<>|.

这是一个已知键盘字符的列表,我认为在消息中使用会很好。

如果您指定了所有要允许的字符,C# 中的正则表达式声明将类似于

@"^[a-zA-Z0-9äüöÄÖÜß!#'\-.:,; ^""§$%&/()=?\}\][{³²°*+~'_<>|]+$"

但是,您提供的测试字符串包含换行符 (LF, \n, \x0A) 字符,因此您需要在没有换行符的字符串上进行测试,或者添加 \n 到字符 class:

@"^[a-zA-Z0-9äüöÄÖÜß!#'\-.:,; ^""§$%&/()=?\}\][{³²°*+~'_<>|\n]+$"

请注意," 字符加倍,因为这是将双引号放入逐字字符串文字的唯一方法。

此外,模式中的捕获括号会产生多余的开销,您应该将其删除。