如何在java中使用正则表达式允许空字符串?

jac*_*cky 3 java regex

基本上我有一个电子邮件框,它只应该包含电子邮件框中允许的字符,但可以为空,问题是当框为空时,它会弹出我创建的错误说

邮箱包含不允许的字符

String UcharSet = "[a-zA-Z0-9-~!_#(@).]+";
boolean UMORN = UserName.matches(UcharSet);
if(!UMORN)
    PopMyError();
Run Code Online (Sandbox Code Playgroud)

只要我知道我的允许列表中没有空字符,那么您能告诉我如何允许该框也可以为空吗?

并告诉我是否获得了电子邮件中允许的所有字符。

And*_*ner 7

最简单的解决方案是将量词更改为*

"[a-zA-Z0-9-~!_#(@).]*"
                     ^ zero or more
Run Code Online (Sandbox Code Playgroud)

您当前正在使用+,这需要一个或多个匹配项。


@TheLostMind 建议使用*效率低下,在使用正则表达式检查有效字符之前,您应该先检查空输入和空输入。

虽然我同意这样做会更有效率,但我认为效率是这里的次要原因:如果您在代码中的意图是仅在用户输入字符串时检查字符串的内容,那么结构化会更好它以这种方式:

if (UserName != null && !UserName.isEmpty()) {  // Or use your favorite library.
  // The user has entered a value: check that it is valid.
  if (!UserName.matches("[a-zA-Z0-9-~!_#(@).]+")) {
    PopMyError();
  }
}
Run Code Online (Sandbox Code Playgroud)

这与 regex 所传达的“空用户名有效”的说法略有不同"[a-zA-Z0-9-~!_#(@).]*"

(当然,我们可以通过预编译模式来创建一个Pattern对象,然后调用pattern.matcher(UserName).matches()条件来提高效率)。

抽查预空/空字符串的另一个好处是,你可以重复使用相同的正则表达式在你的代码的其他部分,在那里你验证希望允许这样的用户名。

我猜上面的逻辑是用在一些UI代码中,用户还在输入数据的地方;不过,您可能希望在实际将数据提交到数据库之前确保用户名确实有效。在那里,你希望允许空的用户名; 最好重用尽可能多的逻辑,以避免不一致:在+那里使用正则表达式的形式是合适的。