首页 > 解决方案 > 确定一个字符串在 Java 中是否包含 *exactly* 3 个单词和 *exactly* 2 个空格

问题描述

我基本上想检查一个字符串是否完全格式化为:"WORD1 WORD2 WORD3",其中 WORD1、WORD2 和 WORD3 是任意词。简而言之,我正在尝试检查一个字符串是否正好包含两个空格和三个单词;除常规字母外,没有数字和符号。

我已经广泛查看了有关 Java 中正则表达式的其他帖子,但这些帖子似乎都没有说明如何精确匹配n 个空格。类似的帖子是thisthis,但它们似乎只解释了如何查找包含空格或是否包含任何空格的字符串。

我查看了有关如何匹配空格的Pattern 类Java 文档,它说:[ \t\n\x0B\f\r]匹配“空白字符”,我相信它包括空格、制表符、换行符、换页符和回车符。

但是当我用 Java 实现代码时,我没有得到我期望的结果:

import java.util.regex.Pattern;

public class WhiteSpace{
    public static void main(String[] args) {
        boolean b = Pattern.matches("[ \\t\\n\\x0B\\f\\r]", "word word word"); 
        System.out.println(b); // This prints false instead of true even though there are 2 spaces in the string.
    }
}

即使尝试只是"[ ]""\\s"似乎不起作用。我对量词也没有运气,比如x{2}?(精确匹配x两次)。令人费解的是,当我在正则表达式测试器网站(例如regex101.com)上尝试相同的东西时,我确实得到了我想要的 2 个匹配项。

一些反馈将不胜感激!

标签: javaregexstring

解决方案


我会String#matches在这里使用以下正则表达式模式:

\S+\s\S+\s\S+

示例脚本:

String input = "WORD1 WORD2\tWORD3";
if (input.matches("\\S+\\s\\S+\\s\\S+")) {
    System.out.println("MATCH");
}

上面的模式应该适用于正好有两个空白字符的 3 个单词,因为没有其他方法可以安排 3 个单词来达到这个要求。

编辑:

如果您只想承认三个单词中的“常规”字母,请使用:

(?i)[A-Z]+\s[A-Z]+\s[A-Z]+

推荐阅读