3

除了字符串匹配之外,还有更简单的方法来解析下面的字符串吗?:

com.atlassian.greenhopper.service.sprint.Sprint@719c9e23
    [name=Sprint 1,
     closed=true,
     startDate=2013-04-10T17:58:49.228-07:00,
     endDate=2013-04-24T17:58:49.228-07:00,
     completeDate=2013-04-16T14:42:09.504-07:00,id=10]

我有兴趣获得name,closed和其他此类值。

org.codehaus.jettison.json.JSONArray(这个字符串是我从 JIRA 获得的 JSONArray 的一个元素 type 。)

4

4 回答 4

3

这就是我这样做的方式,它是可读的并且不涉及正则表达式。

String keyValue = str.substring(str.indexOf("[") + 1, str.lastIndexOf("]"));
StringTokenizer tok = new StringTokenizer(keyValue, ",");
Map<String, String> map = new LinkedHashMap<String, String>();
while (tok.hasMoreTokens()) {
    String entString = tok.nextToken();
    map.put(entString.split("=")[0], entString.split("=")[1]);
}

从这一点上,我得到了我需要的价值

map.get("name")
于 2013-07-16T19:29:59.357 回答
1

因此,这可能不是有效的 JSON,但如果表单每次都相同(就没有额外的嵌套级别而言),它应该可以由正则表达式解析。

首先使用这个正则表达式捕获数组\[(.*)\],中间的组将是数据。然后将该数据拆分为,. 现在您有一个数组,其中每个条目都可以通过您选择的正则表达式轻松解析,除非条目遵循您没有告诉我们的某种形式,或者我没有抓住,每个条目都需要它自己的特定正则表达式这应该相对容易编写。

另外我不确定一开始的部分是否

com.atlassian.greenhopper.service.sprint.Sprint@719c9e23

是重要数据,但也可以由另一个正则表达式解析

解决方案 2

因此,另一个解决方案使用 2 个正则表达式操作将字符串转换为有效的 JSON。

第一的 String result = searchText.replaceAll("(.|\\n)*(\\[(.|\\n)*\\])", "$1");'\

这基本上只是从前面删除了那个大字符串。

下一个

result = searchText.replaceAll("(\\w*)=([^,\\]]*)", "\"$1\" : \"$2\"");

这个正则表达式只是修复了数组以使其成为有效的 JSON 数组,您现在可以在字符串上使用 JSON 解析器。至于在您的解决方案中不使用正则表达式,我说为什么不呢,正则表达式是编程某些人过度使用它们时最具表现力的工具之一,但这是使用正则表达式的完美案例

于 2013-07-12T20:22:01.163 回答
1

你从哪里得到这个字符串?这个输出看起来很像一个toString()实现。你有这个 JSONArray 对象的引用吗?如果是这样:

API表示该对象提供诸如getString(int index).

因此sprintObject.getString(0)应该返回Sprint 1

于 2013-07-12T20:25:24.413 回答
0

我想您可以使用正则表达式来匹配 '=' 和 ',' 之间的匹配项,假设您知道属性名称、已关闭等始终按该顺序存在并且它们不包括 '='、',' 和 '] ' 在他们的价值观中。

Pattern p = Pattern.compile("=.*?[,\\]]");
List<String> matches = new ArrayList<String>();
Matcher matcher = p.matcher(value);
while(matcher.find()) {
    matches.add(matcher.group(0));
}

com.atlassian.greenhopper.service.sprint.Sprint@719c9e23[name=Sprint 1,close=true,startDate=2013-04-10T17:58:49.228-07:00,endDate=2013-04-24T17:58:49.228 -07:00,completeDate=2013-04-16T14:42:09.504-07:00,id=10]

根据您的示例匹配,现在将包含以下字符串:

  • 名称=冲刺 1,
  • 关闭=真,
  • 开始日期=2013-04-10T17:58:49.228-07:00,
  • 结束日期=2013-04-24T17:58:49.228-07:00,
  • 完成日期=2013-04-16T14:42:09.504-07:00,
  • id=10]

我猜你可以从这里拿走。

编辑:正则表达式是否是一个好方法,这种数据格式看起来很像来自类似的返回值

public String toString() {
    return super.toString() + ... ;
}

另外,再想一想,如果真的没有比解析这种格式的其他选择,我会明确匹配属性,例如使用 regex "name=.*?," for name

于 2013-07-12T20:28:20.007 回答