正则表达式 - 在字符串中匹配特殊字符

5

我不是正则表达式专家,所以需要一些帮助,但我无法理解......

我正在编写注册页面并使用asp.net验证器。我需要一个正则表达式验证器,以匹配任何单词中的特殊字符,以满足要求“ID必须至少有一个特殊字符”。允许使用的字符为: ! “ # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~

再次说明,我是初学者,在此时还无法理解这些内容...

目前我有:

[\[\]\^\$\.\|\?\*\+\(\)\\~`!@#%&-_+={}'""<>:;, ]{1,}

但是由于某些原因它也匹配数字,有时不匹配单词开头的字符...

所以,如果有人能帮我解决这个问题...


我讨厌那些要求账号和密码包含特殊字符的网站。 - Sam I am says Reinstate Monica
只是个小建议:如果你正在使用ASP.NET Membership,你可以使用MinRequiredNonAlphanumericCharacters属性来确保密码中输入特殊字符。 - Tim Schmelter
@TimSchmelter - 不要啊,我不会起诉微软 :) 我不能在会员提供程序中使用此验证的原因是,此验证将是可选的 - 它可以打开或关闭,具体取决于客户的需求...而且我们将无法为我们应用程序的所有客户强制执行它。 虽然感谢你的附注。 - Alex
4个回答

6

您需要转义“-”和“!”

[\[\]\^\$\.\|\?\*\+\(\)\\~`\!@#%&\-_+={}'""<>:;, ]{1,}

是的,我忽略了那个...但是,由于某种原因,字符串"asdf3!#"不想使用你的表达式进行验证...也许这与.NET有关... - Alex
看起来你需要同样转义 !。 - Dave Kasper

4

做相反的事情会更容易

^[0-9]|[a-z]|[A-Z]$

如果不匹配,它就有一个特殊字符


1
不能使用这个,它会匹配那些我需要的字符集中未定义的字符,比如黑桃或货币符号... - Alex
2
以这种方式,也许会更好。[^a-zA-Z0-9] - BigMan
更好的方法是也排除空格 [^a-zA-Z0-9\s] - Julian F. Weinert
不完全正确,如果您正在处理Unicode字符甚至是扩展的ASCII字符,那么这完全不同。 - Zombies

1

我不是asp.net或验证专家。但是,字符类只需要转义某些字符,例如[]。破折号-表示一系列字符。如果作为文字使用,则可以在任何位置进行转义并放置,也可以放置在类的开头或结尾([-aa][aa-]),并被视为文字。此外,在类的开头加上插入符号,表示“否定”类的含义,即除了这些字符以外的任何字符([^not me])。

可能还有其他构造类的特殊语法,适用于特定引擎(.NET可能是这样,我不确定)。我猜某些序列也会触发子类。

以下是我的测试案例,使用您的特殊字符进行asp.net验证器。它们可能与此相关,但我不确定。两者似乎都无法验证空输入,这可能不是正则表达式的问题。

    <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" 
        ControlToValidate="TextBox1" ErrorMessage="Input is not valid." 
        ValidationExpression="^.*[\[\]^$.|?*+()\\~`!@#%&\-_+={}'&quot;&lt;&gt;:;,\ ].*$"></asp:RegularExpressionValidator>
    <asp:Button ID="Button1" runat="server" Text="Button" />

如果相关的话,这个似乎可以解决一个安全问题。请注意<+'alpha char',其中'alpha'是指根据某个标准而言的一系列有效Unicode字符。

    <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" 
        ControlToValidate="TextBox1" ErrorMessage="Input is not valid." 
        ValidationExpression="^(?!.*&lt;(?:/|[A-Za-z_:])).*[\[\]^$.|?*+()\\~`!@#%&\-_+={}'&quot;&lt;&gt;:;,\ ].*$"></asp:RegularExpressionValidator>
    <asp:Button ID="Button1" runat="server" Text="Button" />

如果这样偏离题目,请忽略。


0

您可以将其缩小并匹配字符范围。例如,这将匹配所有特殊(和可打印的)字符(包括Unicode)字符:

[^\p{L}]

我想,如果你需要匹配一个或多个,就像你的情况一样,那么这也可以工作(请注意,+正则表达式运算符是{1,}的速记符号)

[^\p{L}]+

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接