问题描述
|
我有一个字符串,格式为
<!-- accountId=\"123\" activity=\"add\" request=\"add user\" -->
参数数量和顺序是随机的。
我需要获取request的值,我需要从字符串中解析添加的用户文本。用Java做到这一点的最佳方法是什么?
解决方法
您可以使用正则表达式进行解析,如下所示:
public static Map<String,String> parse(String s) {
Map<String,String> map = new HashMap<String,String>();
Pattern p = Pattern.compile(\"(\\\\w+)\\\\s*=\\\\s*\\\"(.*?)\\\"\");
Matcher m = p.matcher(s);
while (m.find()) {
map.put(m.group(1),m.group(2));
}
return map;
}
使用示例用法:
String s = \"<!-- accountId=\\\"123\\\" activity=\\\"add\\\" request=\\\"add user\\\" -->\";
Map<String,String> m = parse(s);
// m => {accountId=123,request=add user,activity=add}
m.get(\"request\"); // => \"add user\"
例如,如果需要保留属性的顺序,则可以使用LinkedHashMap或TreeMap。
, 听起来像是一个学校项目,所以除了解决问题外,我只会为您指明正确的方向:查看String Tokenizer类
, 我的解决方案是使用蛮力并根据需要拆分字符串,然后基于该字符串更新ѭ3。这可能是最简单的解决方案。
另一种方法是使用字符串令牌生成器,如Kyle建议的那样。
第三种选择是替换开始和结束标记,以使其形成有效的XML,然后将其解析为XML。是的,我知道这很像用大炮射击苍蝇。但是有时可能需要它,这是一个选择;)
, 您需要执行以下步骤:
找到一个很好的字符序列进行拆分
遍历返回的String数组
当所述String数组的当前索引与您要查找的键匹配时,检索值
, 保持简单的提示:不要一口气解析所有内容。例如,首先尝试检索原始键/值对,例如\'activity = \“ add \” \'。然后从那里继续。
, 如果只需要\“ request \”的值,则最快的方法是:
void getRequest(String str) {
int start = str.indexOf(\"request=\\\"\");
if (start != -1) {
start += 9; // request=\"
end = str.indexOf(\'\"\',start);
if (end != -1) {
return str.substring(start,end);
}
}
// not found
return null;
}
, 我对Python正则表达式很有经验,但是Java语法似乎是相同的。也许从任一端剥离\'\',然后使用类似regex的键值对进行迭代
\'\\s?([\\w ]+)=\"([\\w ]+)\"\\s?(.*?)\'
(假设键和值仅由字母数字字符,空格和下划线组成;否则,可以用其他字符集替换\\ w \)此匹配项中的三个组将是下一个键,下一个值以及字符串的其余部分,可以用相同的方式对其进行解析,直到找到所需的内容为止。