我需要明知地隔离vCard的每一行并获得它的价值。
例如,我想从X-CUSTOMFIELD获得“5555”。
到目前为止,我的想法是:
"X-CUSTOMFIELD;\\d+"
我一直在看一些教程,我对使用什么功能感到困惑?我的正则表达式将返回什么?它会给我整行还是只给出数字部分(5555)?
我在想我得到了整行,我可以使用子字符串来获取数字吗?
BEGIN:VCARD
VERSION:2.1
N:Last;First;
FN:First Last
TEL;HOME;VOICE:111111
TEL;MOBILE;VOICE:222222
X-CUSTOMFIELD;5555
END:VCARD
答案 0 :(得分:0)
你可以搜索“;”或者“:”并使用java API中的subString()方法...作为参数,你可以从中切割子字符串的位置添加。
als end-param你可以使用row.length-1,如果“row”是你当前的行
答案 1 :(得分:0)
为什么不尝试以下正则表达式:
^([^:]+):(.*)$
您需要做的是逐行读取vCard数据,然后您将有两个匹配组(假设表达式正确)
第1组将是字段名称(X-CUSTOMFIELD),第2组将是该字段的数据(5555)
你必须对那个正则表达式进行一些修改,因为它可能不会完全符合你的要求,但它会让你接近你想去的地方。
答案 2 :(得分:0)
vcard字段的格式为KEY[;Attribute]:VALUE[;ATTRIBUTE]
。它看起来像是X-CUSTOMFIELD中的拼写错误,应该是X-CUSTOMFIELD:5555
然后,您可以在每一行上使用line.split(":")
来获取键和值。
修改强>
首先,我读取文件/消息中的所有行,并将它们作为键/值paris存储在Hashtable中(HashMap在android上不可用..)。使用我上面提到的split函数将行拆分为键和值部分。
完成此操作后,只需向哈希表询问键“X-CUSTOMFIELD”的值,它应返回“5555”。 (假设您更正了vcard格式,我仍然肯定X-CUSTOMFIELD行无效!)
编辑2
如果vcard允许重复键,那么您仍然可以使用哈希表作为内部vcard模型,但该值应该是List<String>
类型,而不是String
,并且vcard值将添加到此列表中,像:
Hashtable<String, List<String>> vcard = new Hashtable<String, List<String>>();
for (String line:lines) { // assuming lines is an array or collection with all rows
String keyValuePair = line.split(":");
List<String> values = vcard.get(keyValuePair[0]);
if (values == null) {
// first value for this key - need to create the list
values = new ArrayList<String>();
vcard.put(keyValuePair[0], values);
}
values.add(keyValuePair[1]);
}
(未经测试 - 如果不编译,则将其视为伪代码;-))
答案 3 :(得分:0)
String customfield;
Pattern p = Pattern.compile("X-CUSTOMFIELD;(.+)$");
Matcher m = p.matcher(insertyourcomparestringhere);
if (m.find()) customfield = m.group();
这应该可以解决问题。字符串customfield中只有5555。
答案 4 :(得分:0)
Pattern p = Pattern.compile("X-CUSTOMFIELD;(\\d+)");
Matcher m = p.matcher(your_string);
if(m.find()){
MatchResult mr=m.toMatchResult();
String value=mr.group(1);//this will be 5555
}