【问题标题】:Java regex to find whitespaces or upper-case characters用于查找空格或大写字符的 Java 正则表达式
【发布时间】:2023-04-04 13:33:02
【问题描述】:

我有一个方法可以验证字符串并确保它没有任何空格或大写字符:

boolean validate(String input) {
    if(input.matches(".*\\S.*([A-Z]+)")) {
        return false;
    }

    return true;
}

不幸的是,当我运行它时,它根本不起作用。它不会抛出任何异常,它只允许所有输入字符串(“HelloWorld”、“hello world”、“Hello world”等)通过验证。有什么想法我哪里出错了吗?

【问题讨论】:

  • 如果您的字符串至少有一个 非空白 字符,然后至少有一个大写字母,则您的正则表达式将匹配。它不会执行您想要的匹配。
  • 你最好使用“负正则表达式”和.find();即final Pattern wsOrUpper = Pattern.compile("[A-Z\\s]"),然后尝试wsOrUpper.matcher(input).find())

标签: java regex whitespace casing


【解决方案1】:

您可以使用.matches("[^A-Z\\s]+")

如果您的字符串不包含任何大写字符或空白字符,它将返回 true。

说明

[...] 之间的位称为字符类,它匹配所有提供的字符

  • ^ 使其为负数,因此它匹配所有未提供的内容
  • A-Z 是大写字符的范围
  • \\s 是任何空白字符的简写
  • + 确保您的字符串至少包含 1 个字符或更多。

【讨论】:

  • 为什么开头是插入符号?也还是太复杂了。
  • ^ 使它成为一个负字符类,因此它意味着没有 [] 中的字符,即没有大写字母,也没有空格。
  • 是的,当然——我真傻。这会起作用,尽管我仍然认为我的答案更简单。
  • @Guss 如果可以将所有选项组合到一个字符类中,为什么还要使用|
【解决方案2】:

将您的代码更改为,

boolean validate(String input) {
    if(input.matches(".*?[A-Z\\s].*")) {
        return false;
    }

    return true;
}

因为matches 函数会尝试匹配整个字符串,所以您不需要寻找锚点。如果输入字符串包含空格或大写字母,上述代码将返回 false。

【讨论】:

  • 不需要。它会减少一些调试步骤。
【解决方案3】:

最简单的匹配空格或大写字母的正则表达式是:

.*[A-Z\s].*

如果任何一个这样的字符会使输入无效,那么这将很好地工作。

通常,我会在开头和结尾删除.*,但Java 的String#matches() 必须匹配整个字符串,否则它会失败,这与动态语言中流行的=~ 运算符不同,它将匹配任何子字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 2018-03-10
    • 1970-01-01
    • 2021-06-16
    • 2011-04-04
    • 1970-01-01
    相关资源
    最近更新 更多