Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么是最好的正则表达式而不是此代码?_C#_Regex_Contains - Fatal编程技术网

C# 什么是最好的正则表达式而不是此代码?

C# 什么是最好的正则表达式而不是此代码?,c#,regex,contains,C#,Regex,Contains,Regex对我来说是中文的。我更喜欢写这段代码。 然而,如果我想用正则表达式替换这段代码,那么正则表达式与之最匹配的是什么 if (strValue.Contains(",") || strValue.Contains("-") || strValue.Contains("+") || strValue.Contains(".") || strValue.Contains("!") || strValue.C

Regex对我来说是中文的。我更喜欢写这段代码。 然而,如果我想用正则表达式替换这段代码,那么正则表达式与之最匹配的是什么

        if (strValue.Contains(",") || strValue.Contains("-") || strValue.Contains("+") || strValue.Contains(".") || strValue.Contains("!") ||                    
                strValue.Contains("@") || strValue.Contains("#") || strValue.Contains("$") || strValue.Contains("%") || strValue.Contains("*") ||                    
                strValue.Contains("(") || strValue.Contains(")") || strValue.Contains("}") || strValue.Contains("{") || strValue.Contains("`") ||
                strValue.Contains("\"") || strValue.Contains("^") || strValue.Contains("&") || strValue.Contains("[") || strValue.Contains("]") ||
                strValue.Contains("=") || strValue.Contains("+") || strValue.Contains("!") || strValue.Contains(";") || strValue.Contains(":") || 
                strValue.Contains("|"))
            {
                return false;
            }    

符合您的条件的正则表达式是:

@"[,+.!@#$%*()}{`\\^&[\]=+!;:|-]"
[…]
表示字符类。此类中的任何字符都将与输出匹配


-
必须先到或后到(或者必须转义),因为regex允许您以
[a-z]

的形式指定范围。好吧,简短的答案应该是这样的:

Match match = Regex.Match(input, @"[\,\-\+\.\!\@\#\$\%\*\(\)\{\}\`]", RegexOptions.IgnoreCase);
if (match.Success) {
    return false;
}
然而,我几乎可以肯定,选择“任意排除标点符号列表”的方法可能是错误的。是否只允许一组数字、字符和(可能)下划线?如果是这样,我会只搜索你想要的字符,而不是你认为不想要的字符列表。(如果输入包含印地语字符怎么办((हिन्दी) 例如?)您的示例和关联的正则表达式将允许使用这些字符,而您可能不希望使用这些字符。

如何:

^[^,\-\.!@#\$%\(\)\{\}`\\\^&\[\]=!;:|+\*]+$

如果您的字符串与这个正则表达式匹配,那么它是好的

其实并不复杂:

`^`            start of string
`[^....]`      match all characters NOT inside this class
`+`            match one of more (use * instead if you want to pass empty strings)
`$`            end of string
方括号之间的所有内容(除了第一个
^
)是要拒绝的字符列表,其中一些字符需要转义(使用
\
),因为它们在正则表达式语言中具有特殊意义


编辑:事实上,我可能对转义做得太多了,我认为只有
-
[
]
\
需要转义,但在这种情况下过于谨慎似乎没有什么坏处。

这也有助于理解此代码试图实现的目标。人们可以看到,如果找到某些字符,它将返回false,但您是否正在验证URL或其他内容?您尝试了什么?是否尝试查找RegEx学习如何做的教程?如果是的话,你在哪一部分被卡住了?@AdamHouldsworth:当然,如果他只是想替换代码,那么它运行的对象是什么并不重要……任何其他我认为超出问题范围的内容。@Chris帮助缓解XY问题很重要,了解代码的位置总是很好的代码是如何使用的。就像我说的,人们可以看到代码在做什么,但看不到为什么。编码只是解决问题。你解决这个问题的方法是“我知道我想要什么,但我不想努力。”对我来说,这是不可接受的。
-
在那里肯定不会被用作范围操作符吗?@Chris:发现得好。我已经把它移到了角色类的末尾。它咬了我很多次,我现在总是注意它,把它放在开头或结尾。不过我必须承认,我通常选择开头。;-)您的正则表达式将只匹配一个包含此特定顺序的所有字符的字符串。您缺少一个字符类。您是正确的knitti。我将更新它。发现了它,但直到您也发现了它才更正!您的表达式缺少问题中的几个字符(例如;
=
\
)好的。我不打算再次更新ReGEXP。我知道一些字符丢失了。我的答案是重新考虑OP的方法,即考虑只允许允许的字符,而不是任意的字符列表,这是不允许的。“这并不复杂”。我想对他来说,
^[^,\-\.!@\\$%(\\\\\\\\\\\\\\\\\\\\\\\\\\\\]+$
就是他所说的中文;-)@BlueM:我理解,但乍一看,它很难看,有些(好吧,很多)正则表达式可能会很难读(这是一种纯写语言),但这一个并不复杂。只是这些都不匹配。