Java多拆分保留分隔符

Java多拆分保留分隔符,java,regex,split,substring,Java,Regex,Split,Substring,我知道有人问过类似的问题,但我还没有找到我想要的关于方括号的具体问题 以下是输入: [姓名]鲍勃 [编号]12456703 [街道]任何东西[单位]32[郊区]本莫尔 我希望能够将这些数据输入到hasmap中,括号内的文本将是键,括号外的信息将是数据。 我一直在尝试使用substring和split,但当每行有多组括号时,我遇到了问题? 多亏了很多一个想法(尽管比使用正则表达式效率低)是在每行的空格上分割数据(如果数据的键和值之间确实有空格)。您很可能会得到某种数组 然后,检查一个令牌是否有一个

我知道有人问过类似的问题,但我还没有找到我想要的关于方括号的具体问题

以下是输入:

[姓名]鲍勃
[编号]12456703
[街道]任何东西[单位]32[郊区]本莫尔

我希望能够将这些数据输入到hasmap中,括号内的文本将是键,括号外的信息将是数据。 我一直在尝试使用substring和split,但当每行有多组括号时,我遇到了问题?
多亏了很多

一个想法(尽管比使用正则表达式效率低)是在每行的空格上分割数据(如果数据的键和值之间确实有空格)。您很可能会得到某种数组

然后,检查一个令牌是否有一个左括号,如果有,则将其作为
HashMap
键。 否则,它就是一个值

PriorityQueue

可能是存储这些值的一个很好的集合,因为您可以
peek()
poll()
数据。

类似的方法可以工作

package se.wederbrand.stackoverflow.arraysorter;

import java.util.HashMap;
import java.util.Scanner;

public class ArraySorter {
    public static void main(String[] args) {
        String testString = "[NAME] Bob\n" +
                "[NUMBER] 12456703\n" +
                "[STREET] Anything [UNIT] 32 [SUBURB] Benmore ";

        HashMap<String, String> map = new HashMap<String, String>();

        Scanner scanner = new Scanner(testString);
        // this sets the delimiter to either [ or ]
        scanner.useDelimiter("[\\[\\]]");
        while (scanner.hasNext()) {
            String key = scanner.next();
            String value = scanner.next();

            // trim() removes any extra space or line breaks and leaves a clean string
            map.put(key.trim(), value.trim());
        }
    }
}
包se.wederbrand.stackoverflow.arraysorter;
导入java.util.HashMap;
导入java.util.Scanner;
公共类阵列排序器{
公共静态void main(字符串[]args){
String testString=“[NAME]Bob\n”+
“[编号]12456703\n”+
“[街道]任何[单位]32[郊区]本莫尔”;
HashMap=newHashMap();
扫描仪=新扫描仪(测试字符串);
//这将分隔符设置为[或]
scanner.useDelimiter(“[\\[\]]”);
while(scanner.hasNext()){
字符串键=scanner.next();
字符串值=scanner.next();
//trim()删除任何额外的空格或换行符,并留下干净的字符串
map.put(key.trim(),value.trim());
}
}
}
试试这个:

 HashMap<String, String> map = new HashMap<String, String>(); 
 Pattern regex = Pattern.compile("(\\[\\w+\\])\\s+(\\w+)");
 Matcher regexMatcher = regex.matcher(subjectString);
 while (regexMatcher.find()) {
     // matched text: regexMatcher.group(i)
     // add group 1 to key and group 2 to value of hash
     map.put(regexMatcher.group(1), regexMatcher.group(2));
 } 
HashMap map=newhashmap();
Pattern regex=Pattern.compile(\\[\\w+\\])\\s+(\\w+);
Matcher regexMatcher=regex.Matcher(subjectString);
while(regexMatcher.find()){
//匹配文本:regexMatcher.group(i)
//将组1添加到密钥,将组2添加到哈希值
map.put(regexMatcher.group(1),regexMatcher.group(2));
} 

如果性能不是大问题(即输入文件的大小不是太大),您可以执行以下操作:

input = input.replaceAll("\\[","\n\\[")

使您的输入每行一个括号,从而将问题减少到您已经解决的问题。

请发布您尝试的代码谢谢!现在就来试试吧,这样问题就会出现在更复杂的数据上,比如[NUMBER TEST],这是一个测试,非常感谢,这看起来很完美!