C#正则表达式用于字符串匹配

时间:2015-02-08 00:12:55

标签: c# regex string

我正在寻找一个正则表达式,只有当输入字符串包含以下字符时才会返回成功:

a-zA-Z0-9~!@$^ ()_-+’:.?

这个正则表达式是否正确?

^[a-zA-Z0-9~!@$^ ()_-+’:.?]+$

我已理解^在此处的含义但不确定+$。还有什么替代品吗?顺便说一下,上面的正则表达式还包括^和(

之间的空格字符

3 个答案:

答案 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

这样的字符范围