2017-04-19 132 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