如何将带有< some value>标记的字符串拆分为Map集合,并为其分配布尔值(如果是或不是)?

r8uurelv  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(180)

我有一根像这样的线:

String subject = "Subject Line: <abc> <def> <ghi> some text <hjk>";

我想将其分解并将值放入Map集合中,如下所示:

Map<String, Boolean> maps = new LinkedHashMap<>(); 
maps.put("Subject Line: ", false); 
maps.put("abc", true); 
maps.put("def", true);
maps.put("ghi", true); 
maps.put(" some text ", false); 
maps.put("hjk", true);
qyuhtwio

qyuhtwio1#

如果您稍微更改一下正则表达式,可以使用您的代码:

Pattern p = Pattern.compile("([^>]*)<([^>]+)>"); 
    Matcher m = p.matcher(subject);

    while(matcher.find()) {
        String nonTag = matcher.group(1);
        String tag = matcher.group(2);

        if( !nonTag.isBlank() ) {
            c.put(nonTag, false);
        }

        if( !tag.isBlank() ) {
            c.put(tag, true);
        }
    }

您基本上会在之前查找标记和任何可选的“非标记”文本。最后一个标记后面的任何文本都将是具有该值的最后一个键 false .
我得再深入研究一下这个问题 Matcher api,但似乎没有简单的方法来获得“余数”,因为 appendTail() 等。没有任何事先通知,不得工作 appendReplacement() . 因此,您需要稍微扩展一下循环:

int lastMatch = 0;
while(m.find()) {
  ...
  lastMatch = m.end();
}

if( lastMatch < subject.length() ) {
   c.put( subject.substring(lastMatch), false );
}

相关问题