Java字符串标记

时间:2014-04-23 06:11:19

标签: java regex string

我有一个字符串行

String user_name = "id=123 user=aron name=aron app=application";

我有一个包含以下内容的列表:{user,cuser,suser}

我必须从字符串中获取用户部分。所以我有这样的代码

List<String> userName = Config.getConfig().getList(Configuration.ATT_CEF_USER_NAME);
String result = null;

for (String param: user_name .split("\\s", 0)){
for(String user: userName ){
    String userParam = user.concat("=.*");
    if (param.matches(userParam )) {
        result = param.split("=")[1];
    }
}   
}

但问题是如果String在user_name中包含空格,则它不起作用。 例如:

String user_name = "id=123 user=aron nicols name=aron app=application";

此处user的值aron nicols包含空格。如何编写可以获得精确user值的代码,即aron nicols

3 个答案:

答案 0 :(得分:5)

如果您只想在=之后user=...之后的标记之前的空格上进行拆分,那么可能会添加look ahead条件,如

split("\\s(?=\\S*=)")

此正则表达式将拆分

  • \\s空间
  • (?=\\S*=),其中包含*个非空格\\S字符,后面以=结尾。前瞻(?=...)zero-length匹配,这意味着匹配的部分不会包含在结果中,因此拆分不会在其上拆分。

演示:

String user_name = "id=123 user=aron nicols name=aron app=application";
for (String s : user_name.split("\\s(?=\\S*=)"))
    System.out.println(s);

输出:

id=123
user=aron nicols
name=aron
app=application

根据您在其他答案中的评论,使用=转义的\似乎不应被视为key=value之间的分隔符,而应视为值的一部分。在这种情况下,您只需添加negative-look-behind机制即可查看=之前是否\,因此(?<!\\\\)之前需要=才能\ \ 1}}之前 BTW创建匹配\\的正则表达式我们需要将其写为\但是在Java中我们还需要转义每个\以在String中创建\\\\字面值为什么我们最终得到了split("\\s(?=\\S*(?<!\\\\)=)")

所以你可以使用

String user_name = "user=Dist\\=Name1, xyz src=activedirectorydomain ip=10.1.77.24";
for (String s : user_name.split("\\s(?=\\S*(?<!\\\\)=)"))
    System.out.println(s);

演示:

user=Dist\=Name1, xyz
src=activedirectorydomain
ip=10.1.77.24

输出:

{{1}}

答案 1 :(得分:4)

这样做:

使用此正则表达式首先拆分输入字符串:

" +(?=\\w+(?<!\\\\)=)"

这将为您提供4个name=value代币:

id=123
user=aron nicols
name=aron
app=application

现在您可以在=上拆分以获取您的姓名和价值部分。

Regex Demo

Regex Demo with escaped =

答案 2 :(得分:1)

CODE FISH,这个简单的正则表达式捕获了第1组中的用户:user=\\s*(.*?)\s+name=

它将捕获&#34; Aron&#34;,&#34; Aron Nichols&#34;,&#34; Aron Nichols The Benevolent&#34;等等。 它依赖于name=始终遵循user=

的知识

但是,如果您不确定跟随用户的令牌是否为名称,则可以使用此命令:

user=\s*(.*?)(?=$|\s+\w+=)

以下是如何使用第二个表达式(对于第一个表达式,只需更改Pattern.compile中的字符串:

String ResultString = null;
try {
    Pattern regex = Pattern.compile("user=\\s*(.*?)(?=$|\\s+\\w+=)", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
    Matcher regexMatcher = regex.matcher(subjectString);
    if (regexMatcher.find()) {
        ResultString = regexMatcher.group(1);
    } 
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
}