Java字符串标记

Java字符串标记,java,regex,string,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 (St

我有一条绳子

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];
    }
}   
}
这里
user
有一个值
aron nicols
,其中包含空格。我怎样才能编写一个代码来获得准确的
用户
值,即
aron nicols

这样做:

id=123
user=aron nicols
name=aron
app=application
使用此正则表达式首次拆分输入字符串:

" +(?=\\w+(?<!\\\\)=)"
现在,您只需在
=
上拆分即可获得您的名称和值部分


如果您只想在标记前面的空格上拆分,而标记后面有
=
右键,例如
user=…
,那么可以添加如下条件

split("\\s(?=\\S*=)")
此正则表达式将在

  • \\s
    空格
  • (?=\\S*=)
    包含零个或多个
    *
    非空格
    \\S
    字符,字符后以
    =
    结尾。另外,前瞻
    (?=…)
    是匹配的,这意味着由它匹配的部分将不包括在结果中,因此拆分将不会在其上拆分
演示:

输出:

id=123
user=aron nicols
name=aron
app=application
user=Dist\=Name1, xyz
src=activedirectorydomain
ip=10.1.77.24

从您在其他答案中的评论来看,似乎用
\
转义的
=
不应被视为
键=值
之间的分隔符,而应被视为值的一部分。在这种情况下,您可以添加机制来查看before
=
是否为no
\
,因此
(?before将要求
=
前面不包含
\

顺便说一句,要创建匹配
\
的正则表达式,我们需要将其写成
\
,但在Java中,我们还需要对
\
中的每一个进行转义,以创建字符串形式的
\
文本,这就是我们最终得到
\\
的原因

所以你可以用

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

代码鱼,这个简单的正则表达式捕获组1中的用户:user=\\s*(.*)\s+name=

它将捕获“阿隆”、“阿隆·尼科尔斯”、“阿隆·尼科尔斯的仁者”等等。 它依赖于
name=
始终遵循
user=

但是,如果您不确定以下标记是否为用户名,则可以使用此标记:

user=\s*(.*?)(?=$|\s+\w+=)
下面是如何使用第二个表达式(对于第一个表达式,只需在
模式中更改字符串。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
}

将值放在分隔符之间?如果无法修改文本,则必须拆分并在两个标记之间取平均值。从外观上看,您的数据格式存在一个基本问题。您是否完全坚持使用该格式,或者是否可以修复该格式?尽管可以编写用于提取键和值的解析方法此字符串中的值,格式…有点…不正确。您应该尝试简化格式。不允许在包含空格的文本周围使用空格或加引号(这仍然不适用于split方法)@JonSkeet否数据来自外部应用程序,我无法更改。我必须使用它。@CODEFISH拆分只是处理它的一种方法。直接匹配更便宜(请参阅我的答案)。谢谢你的演示。我喜欢它。数据来自HP archsight。因此,在这种情况下,如果它的用户名或值为conains=,它将为我们提供一个反斜杠。如何处理。我在正则表达式中不是很好。你能告诉我一个示例行吗?然后我肯定可以查看它。String s=“user=Dist\=Name1,xyz src=activedirectorydomain ip=10.1.77.24”;在这个例子中,用户输入了一个带有=号的值,并使用反斜杠转义。谢谢。你能解释一下这个正则表达式吗?这对其他人也有好处,他们将来会研究这个答案。首先,我想知道这个答案有什么问题,因为即使我的答案是先发布的,你也没有接受。很好的解释。但是我有一个我对我在anubhva上发表的评论很好奇。回答不错,但名字不会总是跟在用户后面。它是杜纳米克式生成的。任何字段都可以跟在用户后面。我写这篇文章是为了吃我自己的话。谢谢zx81。@CODEFISH你说“名字不会总是跟在用户后面。”嘿,别担心,我为这种情况添加了第二种方法(也没有拆分)。:)
user=Dist\=Name1, xyz
src=activedirectorydomain
ip=10.1.77.24
user=\s*(.*?)(?=$|\s+\w+=)
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
}