如何将字符串拆分为标记?

时间:2013-09-14 00:12:52

标签: java regex string

我正在寻找将一个字符串拆分成令牌但我在某些情况下很难在引号内键的值是空的。

以下是字符串数据的示例:

keyItem1="super data" keyItem2="" keyItem3="yep"

我想获取密钥及其值数据,即使它是空的。

我尝试使用以下内容,但它有问题,因为我无法获取keyItem2的空字符串:

示例代码:

StringTokenizer stk = new StringTokenizer(data, "=\"");
while (stk.hasMoreTokens())
{
    print(stk.nextToken());
}

返回的数据:
keyItem1
超级数据
keyItem2
keyItem3
是的

我正在考虑使用可能的String.split(正则表达式),但我不确定如何设置正则表达式。

4 个答案:

答案 0 :(得分:2)

您可以将模式和匹配器类与正则表达式(\\w+)=\"(.*?)\"一起使用。这个正则表达式将首先尝试找到

  • (\\w+)一个或多个字符并将其放在第1组
  • =标记
  • \"(.*?)\"置于两个"标记之间的最小字符集,并将其放入第2组

演示

String data = "keyItem1=\"super data\" keyItem2=\"\" keyItem3=\"yep\"";

Pattern p = Pattern.compile("(\\w+)=\"(.*?)\"");
Matcher m = p.matcher(data);
while (m.find()){
    System.out.println("key: '"+m.group(1)+"' value: '"+m.group(2)+"'");
}

输出:

key: 'keyItem1' value: 'super data'
key: 'keyItem2' value: ''
key: 'keyItem3' value: 'yep'

答案 1 :(得分:2)

这是一个可以做你想做的正则表达式:

(?:([a-zA-Z0-9]+)="(.*?)"\s?)点击它进行解释和互动测试。

答案 2 :(得分:1)

第一次拆分为key = value对时有一个神奇的正则表达式:

String[] pairs = input.split(" +(?=(([^\"]*\"){2})*[^\"]*$)");

然后用简单的“=”分割每个键/值:

for (String pair : pairs) {
    String[] parts = pair.split("=",2);
    String key = parts[0];
    String value = parts[1];
}

全部放在一起:

Map<String, String> map = new HashMap<String, String>();
for (String pair : input.split(" +(?=(([^\"]*\"){2})*[^\"]*$)")) {
    String[] parts = pair.split("=",2);
    map.put(parts[0], parts[1].replaceAll("^\"|\"$", ""));
}

瞧!


魔法正则表达式的解释:

正则表达式说“空格(所以键名没有前导空格),但只有输入的其余部分包含偶数引号”

答案 3 :(得分:0)

一个选项是Scanner

    Scanner sc = new Scanner(s);
    sc.useDelimiter("=\"|\" ?");
    while(sc.hasNext()) {
        System.out.println(sc.next());
    }