Java字符串标记

cod*_*ish 0 java regex string

我有一个字符串

String user_name = "id=123 user=aron name=aron app=application";
Run Code Online (Sandbox Code Playgroud)

我有一个包含以下内容的列表:{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];
    }
}   
}
Run Code Online (Sandbox Code Playgroud)

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

String user_name = "id=123 user=aron nicols name=aron app=application";
Run Code Online (Sandbox Code Playgroud)

这里user有一个aron nicols包含空格的值.我怎样才能编写一个可以让我获得确切user价值的代码,即aron nicols

Psh*_*emo 5

如果你只想在之后的权利之前的空格上拆分=,user=...那么可能会添加前瞻性条件,如

split("\\s(?=\\S*=)")
Run Code Online (Sandbox Code Playgroud)

这个正则表达式将分裂

  • \\s 空间
  • (?=\\S*=)其中有零个或多个*非空格\\S字符,=以其后结尾.前瞻(?=...)也是零长度匹配,这意味着它匹配的部分将不会包含在结果中,因此拆分不会在其上拆分.

演示:

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

输出:

id=123
user=aron nicols
name=aron
app=application
Run Code Online (Sandbox Code Playgroud)

从你在其他答案中的评论来看,似乎=逃脱的\不应被视为分隔符之间的分隔符,key=value而是作为值的一部分.在这种情况下,你可以添加负面观察机制,以查看之前=是否是\,所以(?<!\\\\)就在之前需要=没有\它.
BTW创建正则表达式,\我们需要将它写成匹配\\但是在Java中我们还需要转义每个\\在String中创建文字,这就是我们最终的结果\\\\.

所以你可以使用

split("\\s(?=\\S*(?<!\\\\)=)")
Run Code Online (Sandbox Code Playgroud)

演示:

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);
Run Code Online (Sandbox Code Playgroud)

输出:

user=Dist\=Name1, xyz
src=activedirectorydomain
ip=10.1.77.24
Run Code Online (Sandbox Code Playgroud)