【问题标题】:Getting specific values with regex使用正则表达式获取特定值
【发布时间】:2010-05-26 11:16:34
【问题描述】:

我需要有意识地隔离 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

【问题讨论】:

标签: java android regex


【解决方案1】:
            String customfield;
            Pattern p = Pattern.compile("X-CUSTOMFIELD;(.+)$");
            Matcher m = p.matcher(insertyourcomparestringhere);

            if (m.find()) customfield = m.group();

这应该可以解决问题。字符串 customfield 中只有 5555。

【讨论】:

  • 这看起来很有希望,谢谢。我要试一试……天哪,这比php难多了!
  • 我把它改成了这样:Pattern p = Pattern.compile("X-CUSTOMFIELD;\\d+");这似乎成功了! :-D 谢谢!!
【解决方案2】:

您可以搜索“;”或 ":" 并使用 java API 中的 subString() 方法...作为参数,您可以从应剪切子字符串的位置添加到哪里。

如果 "row" 是您的当前行,您可以使用 row.length-1 作为结束参数

【讨论】:

  • 但我首先需要隔离一行才能使用“:”或“;”,对吧?每行都有这两个标点符号之一。
  • jetz,没错。如果我没记错的话,有一种方法可以逐行读取它……类似于“getLine()”。
  • 我认为这是假设 vcard 始终处于相同的顺序?此外,可能存在重复的行,例如拥有多个电话号码或电子邮件地址。
  • 好问题......我真的不知道这个订单是如何解决的,我以前从未使用过它......对于这种情况,你不应该专注于一个固定数量的行但让它可变
【解决方案3】:

为什么不试试下面的正则表达式:

^([^:]+):(.*)$

你要做的是逐行读取vCard数据,然后你会有两个匹配组(前提是表达式正确)

第 1 组将是字段名称 (X-CUSTOMFIELD),第 2 组将是该字段的数据 (5555)

您将不得不对该正则表达式进行一些操作,因为它可能不会完全按照您的意愿行事,但它会让您接近您想要去的地方。

【讨论】:

  • 我的正则表达式创作没有那么先进!看起来令人难以置信。赞!我先试试 SchlaWiener 的建议……
【解决方案4】:

vcard 字段的格式为KEY[;Attribute]:VALUE[;ATTRIBUTE]。它看起来像是 X-CUSTOMFIELD 中的错字,应该是 X-CUSTOMFIELD:5555

然后你可以在每一行使用line.split(":")来获取键和值。

编辑

首先,我会从文件/消息中读取所有行,并将它们作为键/值 paris 存储在 Hashtable 中(HashMap 在 android 上不可用..)。使用我上面提到的 split 函数将行拆分为 key 和 value 部分。

完成此操作后,只需向哈希表询问键“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]);
 }

(未经测试 - 如果它没有编译,则将其视为伪代码;-))

【讨论】:

  • 我很喜欢这个声音,安德烈亚斯。虽然,在电话或电子邮件的情况下会有关键的重复;我可以拥有多个 TEL;HOME;VOICE 吗?我必须检查自定义字段,因为它像其他字段一样是冒号是有意义的。 :-)
【解决方案5】:
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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多