什么是最好的正则表达式而不是这段代码? [关闭]
Posted
技术标签:
【中文标题】什么是最好的正则表达式而不是这段代码? [关闭]【英文标题】:What is the best regex instead of this code? [closed] 【发布时间】:2014-05-10 20:46:50 【问题描述】:对我来说正则表达式是中文的。我更喜欢编写这段代码。 然而,如果我想用正则表达式替换这段代码,什么是最好的正则表达式匹配?
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;
【问题讨论】:
这也有助于理解这段代码试图实现的目标。如果找到某些字符,人们可以看到它会返回 false,但你是在验证 URL 还是用这个? 你试过什么?您是否尝试过查找 RegEx 教程来学习如何做到这一点?如果是这样,您是在哪一部分卡住了? @AdamHouldsworth:当然,如果他只是想替换该代码,那么它所针对的内容并不重要...任何其他我认为超出问题范围的内容。 @Chris 帮助缓解 XY 问题很重要,了解代码的使用位置和方式总是很重要。就像我说的,人们可以看到代码在做什么,但看不到为什么。 编码只是解决问题。你解决这个问题的方法是“我知道我想要什么,但我不想努力”。对我来说,这是不可接受的。 【参考方案1】:符合您条件的正则表达式是:
@"[,+.!@#$%*()`\\^&[\]=+!;:|-]"
[...]
表示字符类。 该类中的任何字符都将匹配输出。
-
必须排在最前面或最后(或必须转义),因为正则表达式允许您以[a-z]
的形式指定范围
【讨论】:
-
肯定不会在那里用作范围运算符吗?
@Chris:很好看。我已将其移至角色类的末尾。
它被我咬了很多次,我现在总是留意它并将它放在开头或结尾。我通常选择开始,但我必须承认。 ;-)【参考方案2】:
怎么样:
^[^,\-\.!@#\$%\(\)\\`\\\^&\[\]=!;:|+\*]+$
http://rubular.com/r/EfsarXwG8I
如果你的字符串匹配这个正则表达式,那就很好。
其实并不复杂:
`^` 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
方括号之间的所有内容(第一个 ^
除外)是您想要拒绝的字符列表,其中一些需要转义的皱纹(使用 \
)因为它们在正则表达式语言。
编辑:实际上,我可能在转义方面做得过火了,我认为只有 -
、[
、]
和 \
需要转义,但似乎不需要在这种情况下过于谨慎会受到伤害。
【讨论】:
“这真的不复杂” - 我认为对他来说^[^,\-\.!@#\$%\(\)\\\\\^&\[\]=!;:|+\*]+$
就是他所说的中文 ;-)
@BlueM:我明白这一点,但乍一看它很难看,而且一些(好吧,很多)正则表达式最终会变得非常难以阅读(这是一个 只写 语言),这个真的不复杂。只是不匹配任何这些。【参考方案3】:
嗯,简短的回答是这样的:
Match match = Regex.Match(input, @"[\,\-\+\.\!\@\#\$\%\*\(\)\\\`]", RegexOptions.IgnoreCase);
if (match.Success)
return false;
但是,我几乎可以肯定,选择“要排除的任意标点符号列表”的方法可能是错误的方法。您是否只想允许一组数字、字符和(可能)下划线?如果是这样,我将只搜索您想要的字符,而不是您认为不想要的字符列表。 (如果输入包含印地语字符(例如(हिन्दी)怎么办?)您的示例和相关的正则表达式将允许这些字符 - 您可能不希望它们。
【讨论】:
您的正则表达式只会匹配包含此特定顺序的所有字符的字符串。你缺少一个字符类。 你说得对。我会更新 感谢 BlueM。发现了它,但直到你也发现它才更正! 您的表达缺少问题中的几个字符(例如:=
和 \
)。
好的。我不会再次更新正则表达式。我知道有些字符丢失了。关于我的回答的要点是重新考虑 OP 的方法,即考虑确保只包含允许的字符,而不是不允许的字符的任意列表。以上是关于什么是最好的正则表达式而不是这段代码? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
为啥这段代码在 for 循环中只使用 x 而不是 x 和 y? [关闭]