您可以使用正则表达式组:
Pattern pattern = Pattern.compile("for user (\\w+)");
Matcher matcher = pattern.matcher(s);
if (matcher.find()) {
System.out.println(matcher.group(1));
}
ŧ他的一对括号(
和)
形成一个组,可以通过匹配器使用group
方法获得(因为它是第一个括号,它是组1)。
\w
表示“单词字符”(字母,数字和_
)和+
表示“一个或多个出现”。所以\w+
的意思基本上是“一个字”(假设你的用户名只有这些字符)。 PS:请注意,我必须转义\
,所以得到的表达式是\\w+
。
这段代码的输出继电器是:
用户名
如果你想匹配的所有值(websiteName,userAgentNameWithSpaces等),你可以做到以下几点:
Pattern pattern = Pattern.compile("Rendering content from (.*) using user agent (.*) ; for user (.*) ; at time (.*)");
Matcher matcher = pattern.matcher(s);
if (matcher.find()) {
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println(matcher.group(3));
System.out.println(matcher.group(4));
}
输出结果为:
websiteNAme
userAgentNameWithSpaces
username
someTime
注意,如果userAgentNameWithSpaces
包含空格,\w+
将无法正常工作(因为\w
不匹配空格),所以.*
会在这种情况下工作。
但你也可以使用[\w ]+
- 在brackes []
意味着“任何我内心的人物”,所以[\w ]
的意思是“一个单词字符,或一个空间”(注意,是w
和]
之间的空间。因此,代码是(带空格的用户名测试):
String s = "Rendering content from websiteNAme using user agent userAgent Name WithSpaces ; for user username ; at time someTime";
Pattern pattern = Pattern.compile("Rendering content from (.*) using user agent ([\\w ]+) ; for user (.*) ; at time (.*)");
Matcher matcher = pattern.matcher(s);
if (matcher.find()) {
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println(matcher.group(3));
System.out.println(matcher.group(4));
}
和输出将是:
websiteNAme
userAgent Name WithSpaces
username
someTime
注意:您可以测试组分别致电matcher.group(n)
之前匹配。 matcher.groupCount()
返回多少组相匹配的方法(因为如果你打电话matcher.group(n)
和组ñ不可用,你会得到一个IndexOutOfBoundsException
)
你尝试过什么?你的'String'格式每次都是一样的吗? – brso05
是的,我试过下面的代码。 private static final Pattern USER_NAME_PATTERN = Pattern.compile(“for user。*;”); final Matcher matcher = USER_NAME_PATTERN.matcher(line); matcher.find()?可选.of(matcher.group(group)):Optional.empty(); 它返回整个字符串“用户名”之后,我必须用空字符串替换用户字符串以获取用户名。 但是,我想知道是否有正则表达式直接获取用户名? –
改为使用内容编辑您的问题。 –