0

我希望将字符串拆分为标记,但在某些情况下我遇到了困难,因为引号内的键值是空的。

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

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

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

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

示例代码:

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

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

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

4

4 回答 4

2

您可以将 Pattern 和 Matcher 类与 regex 一起使用(\\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'
于 2013-09-14T00:32:56.967 回答
2

这是一个正则表达式,可以满足您的要求:

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

于 2013-09-14T00:33:37.013 回答
1

第一次拆分为键=值对有一个神奇的正则表达式:

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("^\"|\"$", ""));
}

瞧!


魔术正则表达式的解释:

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

于 2013-09-14T00:44:56.477 回答
0

一种选择是扫描仪

    Scanner sc = new Scanner(s);
    sc.useDelimiter("=\"|\" ?");
    while(sc.hasNext()) {
        System.out.println(sc.next());
    }
于 2013-09-14T02:53:01.410 回答