什么是最好的正则表达式而不是这段代码? [关闭]

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? [关闭]

最全最好的正则表达式教程

正则表达式匹配关闭的 HTML 标记

如何使用正则表达式匹配 JSON 字符串? [关闭]

js正则表达式 判断输入框是不是为正整数或者正整数保留两位小数

正则表达式检查字符串是不是包含 CSS [关闭]