【问题标题】:Simplifying Regex's - escaping简化正则表达式 - 转义
【发布时间】:2010-09-10 15:33:38
【问题描述】:

我想让我的用户在给定的字符串中指定允许的字符。

所以... 正则表达式很棒,但对我的用户来说太难了。

我的计划是让用户指定允许的字符列表 - 例如

a-z|A-Z|0-9|,

我可以把它转换成一个正则表达式,这样匹配:

[a-zA-Z0-9,]*

但是我有点不知所措来处理所有的转义 - 想象一下如果用户指定了

a-z|A-Z|0-9| |,|||\|*|[|]|{|}|(|)

显然,一种选择是单独处理每个案例,但在我编写这样一个令人讨厌的解决方案之前 - 有没有一些漂亮的方法可以做到这一点?

谢谢

大卫

【问题讨论】:

  • 你要学习你的用户写代码吗?为什么不创建一些预定义的通用集合并提供可供选择的集合?拥有众多用户,您可以获得无限的变化,在大多数情况下非常相似。
  • 我已经接受了下面的答案,因为它有效......我仍然对转义和使用正则表达式的好解决方案感兴趣

标签: c# regex c#-4.0 escaping


【解决方案1】:

忘记正则表达式,这里有一个更简单的解决方案:

bool isInputValid = inputString.All(c => allowedChars.Contains(c));

【讨论】:

  • abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890 写起来非常讨厌 - A-Za-z0-9 要简洁得多
  • 编写一个方法来扩展这些字符范围的折叠形式。
【解决方案2】:

您可能对您的客户是正确的,但您可以提供一些介绍性的正则表达式材料,看看他们是如何理解的 - 您可能会感到惊讶。

如果您真的需要简化,您可能还需要抛弃管道字符的使用,并提供一种替代方法,例如将每个项目放在一个新行中(例如在多行文本框中)。

【讨论】:

  • 我同意。允许正则表达式引擎验证提供模式比编写所有错误处理代码来处理用户提出的所有情况要容易得多。那些对像这样的简单匹配的基本模式有问题的人也会对这里介绍的管道范围有问题。除非您提供某种字符映射以允许他们选择他们想要的内容或范围,否则您必须处理范围中的混合大小写等。
【解决方案3】:

为了让您的用户尽可能简单,为什么不放弃“|”以及字符范围的概念,例如“a-z”,并让他们输入他们想要允许的完整字符列表:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890 *{}()

你明白了。我认为这会简单得多。

【讨论】:

  • abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890 写起来非常讨厌 - A-Za-z0-9 要简洁得多
  • 那么这些用户对 a-z 感到满意,但对完整的正则表达式语法不满意?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
相关资源
最近更新 更多