【问题标题】:Words with two or more capital letters in JavaJava中有两个或多个大写字母的单词
【发布时间】:2021-09-13 13:19:36
【问题描述】:

至少有 2 个大写字母和任何特殊字母(如@#$%^&*()_-+= 等...)的单词可选。

我试过了:

 public static boolean isWordHas2Caps(String s) {
        return s.matches("\\b(?:\\p{Ll}*\\p{Lu}){2,}\\p{Ll}*\\b");
    }

但是,我得到了

    System.out.println(isWordHas2Caps("eHJHJK"));
    System.out.println(isWordHas2Caps("YUIYUI"));
    System.out.println(isWordHas2Caps("LkfjkdJkdfj"));
    System.out.println(isWordHas2Caps("LLdkjkd"));
    System.out.println(isWordHas2Caps("OhdfjhdsjO"));
    System.out.println(isWordHas2Caps("LLLuoiu9898"));
    System.out.println(isWordHas2Caps("Ohdf&jh/dsjO"));
    System.out.println(isWordHas2Caps("auuuu"));
    System.out.println(isWordHas2Caps("JJJJJJJJ"));
    System.out.println(isWordHas2Caps("YYYY99999"));
    System.out.println(isWordHas2Caps("ooooPPPP"));

输出:

true   eHJHJK
true   YUIYUI
true   LkfjkdJkdfj
true   LLdkjkd
true   OhdfjhdsjO
false   LLLuoiu9898       It should be true but getting false
false   Ohdf&jh/dsjO      It should be true but getting false
false   auuuu
true   JJJJJJJJ
false   YYYY99999        It should be true but getting false
true   ooooPPPP

我想,我应该在正则表达式和数字和特殊字母中。我该怎么做?

【问题讨论】:

  • 你能更正我的正则表达式并分享正确的正则表达式吗?
  • 使用Pattern.compile("\\p{Lu}\\P{Lu}*\\p{Lu}").matcher(s).find(),回溯是轻量级的,因为\p{Lu}\P{Lu}是互斥的。
  • @Sun,以下任何答案是否有助于您解决问题?

标签: java regex


【解决方案1】:

更新:

来自anubhava的宝贵意见:

可能s.matches("(?:\\S*\\p{Lu}){2}\\S*"); 可能会更好

Demo以上解决方案。

原答案:

您可以使用regex\b.*\p{Lu}.*\p{Lu}.*\b,如下所示:

public static boolean isWordHas2Caps(String s) {
    return s.matches("\\b.*\\p{Lu}.*\\p{Lu}.*\\b");
}

演示:

public class Main {
    public static void main(String[] args) {
        System.out.println(isWordHas2Caps("eHJHJK"));
        System.out.println(isWordHas2Caps("YUIYUI"));
        System.out.println(isWordHas2Caps("LkfjkdJkdfj"));
        System.out.println(isWordHas2Caps("LLdkjkd"));
        System.out.println(isWordHas2Caps("OhdfjhdsjO"));
        System.out.println(isWordHas2Caps("LLLuoiu9898"));
        System.out.println(isWordHas2Caps("Ohdf&jh/dsjO"));
        System.out.println(isWordHas2Caps("auuuu"));
        System.out.println(isWordHas2Caps("JJJJJJJJ"));
        System.out.println(isWordHas2Caps("YYYY99999"));
        System.out.println(isWordHas2Caps("ooooPPPP"));
    }

    public static boolean isWordHas2Caps(String s) {
        return s.matches("\\b.*\\p{Lu}.*\\p{Lu}.*\\b");
    }
}

输出:

true
true
true
true
true
true
true
false
true
true
true

【讨论】:

  • 可能s.matches("(?:\\S*\\p{Lu}){2}\\S*"); 可能会更好
【解决方案2】:

您想检查字符串中是否至少有两个大写字母可以包含任意字符。

然后,你可以使用

public static boolean isWordHas2Caps(String s) {
    return Pattern.compile("\\p{Lu}\\P{Lu}*\\p{Lu}").matcher(s).find();
}

请参阅Java demo

或者,如果您仍想使用String#matches,您可以使用以下内容(请记住,我们需要匹配整个字符串):

public static boolean isWordHas2Caps(String s) {
    return s.matches("(?s)(?:\\P{Lu}*\\p{Lu}){2}.*");
}

(?s)(?:\\P{Lu}*\\p{Lu}){2}.* 正则表达式匹配

  • (?s) - Pattern.DOTALL 嵌入标志选项(使 . 匹配任何字符)
  • (?:\P{Lu}*\p{Lu}){2} - 除了大写字母和一个大写字母之外,任何零个或多个字符出现两次
  • .* - 字符串的其余部分。

您的代码未返回预期结果,因为它们都包含非字母字符,而String#matches() 需要与模式进行完整字符串匹配,而您的代码匹配仅包含字母的字符串。

这就是你应该这样做的原因

  • 确保您可以匹配字符串中的任何位置,Matcher.find 最能胜任这项工作
  • \p{Lu}\P{Lu}*\p{Lu} 模式将找到任何大写字母 + 任何零个或多个非字母 + 大写字母的序列
  • 或者,您可以使用(?s)(?:\P{Lu}*\p{Lu}){2}.* 正则表达式匹配包含至少两个大写字母的完整字符串。

【讨论】:

  • 仅供参考,请参阅 regex101 demo,只需从 \P{L} 中减去一个换行符。
猜你喜欢
  • 2011-09-15
  • 2014-11-23
  • 1970-01-01
  • 2022-01-09
  • 2015-12-10
  • 2012-06-11
  • 2020-08-30
相关资源
最近更新 更多