我正在寻找一个正则表达式,只有当输入字符串包含以下字符时才会返回成功:
a-zA-Z0-9~!@$^ ()_-+’:.?
这个正则表达式是否正确?
^[a-zA-Z0-9~!@$^ ()_-+’:.?]+$
我已理解^
在此处的含义但不确定+$
。还有什么替代品吗?顺便说一下,上面的正则表达式还包括^和(
答案 0 :(得分:2)
它只包含上面列出的字符
bool invalidCharsExist =
Regex.Replace(input, @"[a-zA-Z0-9~!@\$\^\ \(\)_\-\+’:\.\?]", "").Length != 0;
BTW:这不完全等同于你的正则表达式(它还包括非ascii字母和数字),但我认为这是一种更好的检查方式
var specialChars = new HashSet<char>("~!@$^ ()_-+’:.?");
var allValid = input.All(c => char.IsLetterOrDigit(c) || specialChars.Contains(c));
答案 1 :(得分:1)
关闭,但在你的角色类中间摆脱那个短划线并把它放在开头:
^[-a-zA-Z0-9~!@$^ ()_+’:.?]+$
并确保当你将它放在一个字符串中时,你使用了正确的字符串限定符(我忘记它被称为):
@"^[-a-zA-Z0-9~!@$^ ()_+’:.?]+$"
至于你是否可以通过其他方式做到这一点,确定,例如,实际上并不匹配的负面预测。我认为正确的正则表达式优化器会让一个优于另一个,这只是一个偏好问题。你想要看起来成功的东西(如果有效则选择整个字符串),或者看起来失败的东西(负面预测)。
老实说,如果性能非常重要,那么你应该编写一个好的旧for
并循环遍历字符(或等效的LINQ实现)。正则表达式甚至不会在球场上。
答案 2 :(得分:1)
正则表达式为:^[a-zA-Z0-9~!@$^ ()_\-+’:.?]+$
我个人建议使用https://regex101.com来检查正则表达式 - 请注意,他们没有C#支持,但一般来说,javascript&#39; RegExp
的语法与C#类似,但是它确实给你一个特别有用的解释,你的表达在做什么,这是从那里的这个表现的解释:
^
在字符串[a-zA-Z0-9~!@$^ ()_\-\+’:.?]+
匹配下面列表中的单个字符
+
在一次和无限次之间,尽可能多次,根据需要回馈[贪心] a-z
a和z之间范围内的单个字符(区分大小写)A-Z
A和Z之间范围内的单个字符(区分大小写)0-9
0到9之间范围内的单个字符~!@$^ ()_
列表~!@$^ ()_
中的单个字符\-
字面匹配字符-
+’:.?
列表’:.?
中的单个字符$
断言字符串末尾的位置你在OP中放入的内容的问题实际上只是忘记逃避-
,因为它在正则表达式模式中保留用于特殊目的(即[]
表示法保留-
来声明像a-z
)