用于字符串匹配的C#正则表达式
我正在寻找仅当输入字符串包含以下字符时才返回成功的正则表达式:用于字符串匹配的C#正则表达式,c#,regex,string,C#,Regex,String,我正在寻找仅当输入字符串包含以下字符时才返回成功的正则表达式: a-zA-Z0-9~!@$^ ()_-+’:.? 这个正则表达式正确吗 ^[a-zA-Z0-9~!@$^ ()_-+’:.?]+$ 我已经理解了^在这里的意思,但不确定+$是什么意思。还有其他的选择吗?顺便说一下,上面的正则表达式还包含^ ^和(结尾)之间的空格字符,但是在字符类的中间去掉那个破折号,并把它放在开始处: ^[-a-zA-Z0-9~!@$^ ()_+’:.?]+$ 并确保在将其放入字符串时使用正确的字符串限定符(
a-zA-Z0-9~!@$^ ()_-+’:.?
这个正则表达式正确吗
^[a-zA-Z0-9~!@$^ ()_-+’:.?]+$
我已经理解了
^
在这里的意思,但不确定+$
是什么意思。还有其他的选择吗?顺便说一下,上面的正则表达式还包含^ ^和(结尾)之间的空格字符,但是在字符类的中间去掉那个破折号,并把它放在开始处:
^[-a-zA-Z0-9~!@$^ ()_+’:.?]+$
并确保在将其放入字符串时使用正确的字符串限定符(我忘了它的名称):
至于你是否可以用其他的方法来做,当然,比如说一个消极的前瞻,实际上并不匹配任何东西。我不认为一个合适的正则表达式优化器会让一个优化器比另一个优化器更好,这只是一个偏好的问题。你想要看起来成功的东西吗(如果有效,选择整个字符串),或看起来失败的东西(消极的前瞻)
老实说,如果性能非常重要,那么您应该为编写一个好的,并在字符上循环(或等效的LINQ实现)。Regex甚至不会有什么问题
它只包含上面列出的字符
顺便说一句:这并不完全等同于您的正则表达式(它还将包括非ascii字母和数字),但我认为这是一种更好的检查方法
var specialChars = new HashSet<char>("~!@$^ ()_-+’:.?");
var allValid = input.All(c => char.IsLetterOrDigit(c) || specialChars.Contains(c));
var specialChars=newhashset(“~!@$^()\-+”:.?”;
var allValid=input.All(c=>char.isleterordigit(c)| | specialChars.Contains(c));
正则表达式应该是:^[a-zA-Z0-9~!@$^()\-+':.?]+$
我个人建议使用检查正则表达式-注意它们没有C#支持,但一般来说javascript的RegExp
与C#语法相似,但它确实为您提供了一个特别有用的解释,说明了您的表达式在做什么,下面是EPRESION的解释:
^
在字符串开头断言位置
[a-zA-Z0-9~!@$^()\u\-\+':.?]+
匹配下表中的单个字符
- 量词:
+
在一次和无限次之间,尽可能多次,根据需要回馈[贪婪]
a-z
a-z范围内的单个字符(区分大小写)
A-Z
A-Z范围内的单个字符(区分大小写)
0-9
0到9之间的单个字符
~!@$^()\u
列表中的单个字符
\-
逐字匹配字符-
+':.?
列表中的单个字符':.?
字面意思
$
在字符串末尾断言位置
您在OP中输入的问题实际上只是忘记转义-
,因为它在正则表达式模式中保留用于特殊目的(即在[]
表示法中,-
保留用于声明类似a-z
的字符范围)谢谢。我只需要确保在将输入字符串传递到服务之前,它只包含上面列出的字符。它不应该包含任何其他字符。您可以在.Net中将\w用作[a-zA-Z_0-9]的缩写。
bool invalidCharsExist =
Regex.Replace(input, @"[a-zA-Z0-9~!@\$\^\ \(\)_\-\+’:\.\?]", "").Length != 0;
var specialChars = new HashSet<char>("~!@$^ ()_-+’:.?");
var allValid = input.All(c => char.IsLetterOrDigit(c) || specialChars.Contains(c));