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类。)。