使用正则表达式获取特定值

时间:2010-05-26 11:16:34

标签: java android regex

我需要明知地隔离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

5 个答案:

答案 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
}