【问题标题】:How to parse name=value^^name=value^^name=value如何解析名称=值^^名称=值^^名称=值
【发布时间】:2012-10-19 22:42:42
【问题描述】:

我的问题:非常具体。我正在想最简单的方法来解析以下文本:

^^domain=domain_value^^version=version_value^^account_type=account_type_value^^username=username_value^^password=password_value^^type=type_value^^location=location_value^^id=xxx^^cuid=cuid_value^^

它每次都会完全一样。几个要求:

  • 并非所有这些键值对每次都会出现。
  • 它们的顺序可能不同

我正在寻找类似这样的代码:

private String[] getKeyValueInfo(String allStuff) {
  String domain = someAwesomeMethod("domain", allStuff);
  String version = someAwesomeMethod("version", allStuff);
  String account_type = someAwesomeMethod("account_type", allStuff);
  String username = someAwesomeMethod("username", allStuff);
  String password = someAwesomeMethod("password", allStuff);
  String type = someAwesomeMethod("password", allStuff);
  String location = someAwesomeMethod("location", allStuff);
  String id = someAwesomeMethod("id", allStuff);
  String cuid  = someAwesomeMethod("cuid", allStuff);
  return new String[] {domain, version, account_type, username, password, type, location, id, cuid};
}

我不知道someAwesomeMethod(String key, String allStuff) 应该包含什么。

我在想什么:这样的:

private String someAwesomeMethod(String key, String allStuff) {
  Pattern patt = Pattern.compile("(?i)^^" + key + "=(.*?)^^", Pattern.DOTALL);
  Matcher matcher = patt.matcher(allStuff);
  if (matcher.find()) {
    return matcher.group(1);
  }
  return null;
}

这有什么问题:

我担心如果我不得不经常这样做会有点慢/麻烦。所以我正在寻找任何提示/建议。

【问题讨论】:

  • 我认为String.split() 不会让你的船浮起来?
  • @RobertHarvey .split() 仍然使用正则表达式,您仍然需要解析出键和参数。
  • 没关系。只需在"=" 上再次拆分每个拆分。
  • 这听起来像是过早的优化。在进行优化之前对程序进行概要分析,因为我非常怀疑即使您调用它数千次也会成为瓶颈。
  • @m.buettner 如果键或值包含插入符号,这将是一个问题,我怀疑这是 OP 使用两个插入符号分割事物的原因。

标签: java regex string parsing


【解决方案1】:

如果你必须做很多事情,我会制作一张地图,类似于

Map<String, String> m = new HashMap<String, String>();
for (String s : stuff.split("\\^\\^"))  // caret needs escaping
{  
    String[] kv = s.split("=");
    m.put(kv[0]) = kv[1];
}

然后查找您只需执行m.get("key")的密钥

【讨论】:

    【解决方案2】:

    String.split() 将为此工作

    strVar = /* Your big long string */
    String[] vars = strVar.split("\\^\\^"); // needs escaping
    

    【讨论】:

      猜你喜欢
      • 2010-11-26
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多