Java 正则表达式与由空格分隔的单词不匹配

Java 正则表达式与由空格分隔的单词不匹配,java,regex,Java,Regex,我有一个输入字符串,它将遵循模式/user/?name=,其中是字母数字,但必须以字母开头,是一个只能包含多个空格的字母字符串。匹配的一些示例如下: /user/ad?name=a a /user/one111?name=one ONE oNe /user/hello?name=world 我提出了以下正则表达式: String regex = "/user/[a-zA-Z]+\\w*\\?name=[a-zA-Z\\s]+"; 以上所有示例都与正则表达式匹配,但它只查看中的第一个单词。序列

我有一个输入字符串,它将遵循模式
/user/?name=
,其中
是字母数字,但必须以字母开头,
是一个只能包含多个空格的字母字符串。匹配的一些示例如下:

/user/ad?name=a a
/user/one111?name=one ONE oNe
/user/hello?name=world
我提出了以下正则表达式:

String regex = "/user/[a-zA-Z]+\\w*\\?name=[a-zA-Z\\s]+";
以上所有示例都与正则表达式匹配,但它只查看
中的第一个单词。序列
\s
不应该允许我使用空格吗

我用来测试它的代码是:

String regex = "/user/[a-zA-Z]+\\w*\\?name=[a-zA-Z\\s]+";
// Check to see that input matches pattern
if(Pattern.matches(regex, str) == true){
   str = str.replaceFirst("/user/", "");
   str = str.replaceFirst("name=", "");
   String[] tokens = str.split("\\?");
   System.out.println("size = " + tokens.length);
   System.out.println("tokens[0] = " + tokens[0]);
   System.out.println("tokens[1] = " + tokens[1]);
} else
    System.out.println("Didn't match.");
例如,一个测试可能如下所示:

/user/myID123?name=firstName LastName
size = 2
tokens[0] = myID123
tokens[1] = firstName
而期望的输出是

tokens[1] = firstName LastName

如何更改正则表达式以实现此目的?

不确定您认为代码中存在的问题<代码>标记[1]在您的示例中确实将包含
名LastName

这是一个演示


但是,您是否考虑过为id和名称使用捕获组

如果你这样写的话

String regex = "/user/(\\w+)\\?name=([a-zA-Z\\s]+)";

Matcher m = Pattern.compile(regex).matcher(input);

您可以通过
m.group(1)
m.group(2)

获得
myID123
firstName-LastName
,但不确定您认为代码中存在什么问题<代码>标记[1]在您的示例中确实将包含
名LastName

这是一个演示


但是,您是否考虑过为id和名称使用捕获组

如果你这样写的话

String regex = "/user/(\\w+)\\?name=([a-zA-Z\\s]+)";

Matcher m = Pattern.compile(regex).matcher(input);

您可以通过
m.group(1)
m.group(2)
获得
myID123
firstName LastName
,我在您的代码中没有发现任何错误,但您可以捕获这样的组:

    String str = "/user/myID123?name=firstName LastName ";      
    String regex = "/user/([a-zA-Z]+\\w*)\\?name=([a-zA-Z\\s]+)";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(str);
    if(m.find()) {
        System.out.println(m.group(1) + ", " + m.group(2));
    }

我没有发现您的代码中有任何错误,但您可以这样捕获组:

    String str = "/user/myID123?name=firstName LastName ";      
    String regex = "/user/([a-zA-Z]+\\w*)\\?name=([a-zA-Z\\s]+)";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(str);
    if(m.find()) {
        System.out.println(m.group(1) + ", " + m.group(2));
    }

问题是默认情况下,
*
是贪婪的(它匹配整个字符串),因此需要通过添加
来修改正则表达式(使其不情愿):


问题是默认情况下,
*
是贪婪的(它匹配整个字符串),因此需要通过添加
来修改正则表达式(使其不情愿):


次要挑剔:此正则表达式还匹配以数字开头的ID。True。。OP没有;)因为上面贴着家庭作业,所以我把它作为练习;)非常感谢。我不知道分组,它确实帮助我清理了代码。小挑剔:这个正则表达式也匹配以数字开头的ID。真的。。OP没有;)因为上面贴着家庭作业,所以我把它作为练习;)非常感谢。我不知道分组的情况,它确实帮助我清理了代码。也许我做错了其他事情,但这对我来说没有任何改变:(不过,感谢您的回答!您需要像我的示例中那样重新构造代码并使用Matcher和Pattern类。也许我做错了其他事情,但这对我来说没有任何改变:(不过,感谢您的回答!您需要像我的示例中那样重新构造代码并使用Matcher和Pattern类。)。