2017-04-19 133 views
0

我在粗獷的幾個字符串:使用正則表達式提取特定的值在Java中

String s = "Rendering content from websiteNAme using user agent userAgentNameWithSpaces ; for user username ; at time someTime"; 

我想提取websiteName,userAgentNameWithSpaces,用戶名和某個值。 我試過下面的代碼。

private static final Pattern USER_NAME_PATTERN = Pattern.compile("for user.*;"); 
final Matcher matcher = USER_NAME_PATTERN.matcher(line); 
matcher.find() ? Optional.of(matcher.group(group)) : Optional.empty(); 

它返回整個字符串「用戶名」之後,我不得不更換用空字符串來獲取用戶名用戶的字符串。 但是,我想知道是否有正則表達式直接獲取用戶名?

+1

你嘗試過什麼?你的'String'格式每次都是一樣的嗎? – brso05

+0

是的,我試過下面的代碼。 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(); 它返回整個字符串「用戶名」之後,我必須用空字符串替換用戶字符串以獲取用戶名。 但是,我想知道是否有正則表達式直接獲取用戶名? –

+1

改爲使用內容編輯您的問題。 –

回答

1

您可以使用正則表達式組:

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

+0

感謝您的解釋。 現在,我正在使用此表達式來匹配userAgentWithSpaces。勒米知道這是否正確。 Pattern.compile(「using user agent([\\ w * \\ s *] *)」); –

+0

這個怎麼樣。 模式TEMPLATE_LOG_PATTERN = Pattern.compile( 「使用用戶代理(。*)從(。*)呈現內容;用戶(。*);在時間(。*)$」); time = System.out.println(matcher.group(4).trim()); userName = System.out.println(matcher.group(3).trim()); –

+0

我已經更新了答案 – 2017-04-20 12:08:23

1

我想你想使用向前看符號和lookbehinds:

String s = "Rendering content from websiteNAme using user agent userAgentNameWithSpaces ; for user username ; at time someTime"; 
Pattern USER_NAME_PATTERN = Pattern.compile("(?<=for user).*?(?=;)"); 
final Matcher matcher = USER_NAME_PATTERN.matcher(s); 
matcher.find(); 
System.out.println(matcher.group(0).trim()); 

輸出:

用戶名

+0

像魅力一樣工作。 非常感謝。 –

+0

你可以用'[^;] *'或者甚至是'[^;] * +'替換'。*?'來保存一些匹配嘗試。 – Andrey