我有一个字符串行
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
答案 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
现在您可以在=
上拆分以获取您的姓名和价值部分。
答案 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
}