【问题标题】:Java: check if string ends or starts with a special character [duplicate]Java:检查字符串是否以特殊字符结尾或开头[重复]
【发布时间】:2012-03-22 09:27:23
【问题描述】:

可能重复:
JAVA: check a string if there is a special character in it

我正在尝试创建一种方法来检查密码是否以特殊字符开头或结尾。我已经设法编写了一些其他检查,但这似乎有点复杂。

我认为我需要使用正则表达式来有效地做到这一点。我已经创建了一个方法来检查是否有任何特殊字符,但我不知道如何修改它。

Pattern p = Pattern.compile("\\p{Punct}");
Matcher m = p.matcher(password);
boolean a = m.find();
if (!a)
  System.out.println("Password must contain at least one special character!");

根据我正在阅读的书,我需要在模式中使用 ^ 和 $ 来检查它是否以特殊字符开头或结尾。我可以将这两个语句都添加到现有模式中吗?或者我应该如何开始解决这个问题?

编辑:

好的,我想我得到了非正则表达式的方法:

for (int i = 0; i < password.length(); i++) {
  if (SPECIAL_CHARACTERS.indexOf(password.charAt(i)) > 0)
  specialCharSum++;
}

【问题讨论】:

标签: java regex


【解决方案1】:

最简单的方法是使用 or 进行分组。

Pattern p = Pattern.compile("(^\\p{Punct})|(\\p{Punct}$)");
Matcher m = p.matcher(password);
boolean a = m.find();
if (!a)
  System.out.println("Password must contain at least one special character at the beginning or end!");

【讨论】:

  • 虽然我可能会想通过编写 if (!passowrd.matches(...)) [当然要对正则表达式进行适当修改]来减少冗长的内容。跨度>
  • 当然——我对 dichrit 的代码做了最小的修改。我也考虑过类似于 Adam Mihalcin 的 charAt 方法的内容,但同样,发帖者似乎理解这段代码,那为什么要更改它呢?
【解决方案2】:

使用这种模式:

"^\\p{Punct}|\\p{Punct}$"
  • ^\\p{Punct} = "字符串开头,后跟标点符号
  • | = "或"
  • \\p{Punct}$ = "标点符号,后跟字符串结尾"

【讨论】:

    【解决方案3】:

    你不能只用charAt来获取字符,用indexOf来检查字符是否特殊吗?

    final String SPECIAL_CHARACTERS = "?#"; // And others
    
    if (SPECIAL_CHARACTERS.indexOf(password.charAt(0)) >= 0
            || SPECIAL_CHARACTERS.indexOf(password.charAt(password.length() - 1)) >= 0) {
        System.out.println("password begins or ends with a special character");
    }
    

    我没有分析(分析是性能的黄金法则),但我希望迭代编译时常量字符串比为正则表达式构建和执行有限状态自动机更快。此外,Java 的正则表达式比 FSA 更复杂,所以我认为 Java 正则表达式的实现方式不同,因此比 FSA 慢。

    【讨论】:

    • 这几乎就是我现在在编辑框中输入的内容,但你更快。我分享你对(ab)使用正则表达式处理像这样的简单案例的想法。
    • 你当然可以。这仅取决于您是否碰巧喜欢正则表达式的简洁性,或者如果您不熟悉正则表达式,则更喜欢一些更冗长的代码以换取更明确的代码。如果您知道自己在做什么,那么正则表达式就有可能将各种检查压缩成一行简洁的代码。所以这真的是一个偏好问题——哪种代码更容易阅读和理解?
    • @NeilCoffey 无论您是否使用正则表达式,都应该将这样的检查打包到一个方法中。那么,在其他代码中,检查同样冗长,因为无论哪种方式,它都是单个方法调用。在方法内部,无论哪种方式,含义都很清楚。
    • 是的——我想我可能更多地考虑维护相关方法的人。我不反对你的解决方案——我认为这只是一个偏好问题,仅此而已。
    • 永远不要使用charAt。它坏了。你需要codePointAt
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 2020-02-16
    • 1970-01-01
    相关资源
    最近更新 更多