2011-12-01 132 views
2

我知道类似的问题已被问到,但我还没有找到具体的东西,我正在寻找涉及方括号。Java多重分割 - 保留分隔符

下面是输入:

[NAME]鲍勃
[NUMBER] 12456703
[STREET]任何[UNIT] 32 [郊区]本摩尔

我希望能够将这些数据输入到一个hasmap中,其中括号中的文本将成为关键字,括号中的信息将成为数据。 我一直在尝试使用子字符串和拆分,但当每行有一组以上的括号时,我遇到了问题?
非常感谢

+3

请发布你试过的代码 –

回答

2

试试这个:

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)); 
} 
+0

非常感谢,这似乎是完美的! –

1

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

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

PriorityQueue 

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

3

这样的事情会起作用。

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()); 
     } 
    } 
} 
3

如果性能是不是一个大问题(即输入文件的大小不是太大),你可以做:

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

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

+0

谢谢!现在就试试看吧 –

+0

所以这些问题伴随着更复杂的数据,如[数字测试]这是一个测试 –