您可以使用正則表達式組:
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(); 它返回整個字符串「用戶名」之後,我必須用空字符串替換用戶字符串以獲取用戶名。 但是,我想知道是否有正則表達式直接獲取用戶名? –
改爲使用內容編輯您的問題。 –