java - 从字符串中获取标记之间的字符串

标签 java android regex string vcf-vcard

我对正则表达式不是很熟悉,所以我在这里问。

我有这样一个字符串:

BEGIN:VCARD
VERSION:3.0
FN:A Sirius Swimwear Collection
N:Collection;A;Sirius Swimwear;;
TEL;TYPE=HOME:22448
TEL;TYPE=CELL:52316
ADR:;Taylors Road;;;;;
ORG:Norfolk Phone Book
END:VCARD
BEGIN:VCARD
VERSION:3.0
FN:A Walk in the Wild
N:Wild;A;Walk in the;;
TEL;TYPE=HOME:22502
item1.TEL:23205
item1.X-ABLabel:Facsimile
ADR:;Grassy Road;;;;;
ORG:Norfolk Phone Book
END:VCARD
BEGIN:VCARD
VERSION:3.0
FN:AATA Orn Tours
N:Tours;AATA;Orn;;
TEL;TYPE=HOME:23611
TEL;TYPE=CELL:50755
ADR:;Bookings;;;;;
ORG:Norfolk Phone Book
END:VCARD
BEGIN:VCARD
VERSION:3.0
FN:Aatuti Art
N:Art;Aatuti;;;
TEL;TYPE=HOME:23669
ADR:;The Village;;;;;
ORG:Norfolk Phone Book
END:VCARD
BEGIN:VCARD
VERSION:3.0
FN:ABC Hobby Centre
N:Centre;ABC;Hobby;;
TEL;TYPE=HOME:22139
ADR:;Taylors Road;;;;;
ORG:Norfolk Phone Book
END:VCARD
(...)

对于那些熟悉的人来说,这是一堆 VCard,我想从 String 中一张一张地得到一张 VCard。所以,我想把它分成多个字符串。我想用 BEGIN:VCARDEND:VCARD 标签拆分

结束:

vcard1 = "BEGIN:VCARD
    VERSION:3.0
    FN:A Sirius Swimwear Collection
    N:Collection;A;Sirius Swimwear;;
    TEL;TYPE=HOME:22448
    TEL;TYPE=CELL:52316
    ADR:;Taylors Road;;;;;
    ORG:Norfolk Phone Book
    END:VCARD";

vcard2 = "BEGIN:VCARD
    VERSION:3.0
    FN:A Walk in the Wild
    N:Wild;A;Walk in the;;
    TEL;TYPE=HOME:22502
    item1.TEL:23205
    item1.X-ABLabel:Facsimile
    ADR:;Grassy Road;;;;;
    ORG:Norfolk Phone Book
    END:VCARD";

vcard3 = "BEGIN:VCARD
    VERSION:3.0
    FN:AATA Orn Tours
    N:Tours;AATA;Orn;;
    TEL;TYPE=HOME:23611
    TEL;TYPE=CELL:50755
    ADR:;Bookings;;;;;
    ORG:Norfolk Phone Book
    END:VCARD";

老实说,我只需要正确的正则表达式模式作为我能够完成的循环。 这是在 JAVA 中(适用于 Android)。

编辑

这是我到目前为止没有成功的尝试:

if(vcard.contains("VERSION:"))
        {
            Log.d(TAG, "Creating the patterns");
            Pattern p = Pattern.compile("BEGIN:VCARD(.*)END:VCARD");

            Matcher m = p.matcher(vcard);

            if (m.find()) 
            {

                Log.d(TAG, "Find: " + m.group(1));

            }
            Log.d(TAG, "Not found anything");

最佳答案

您可以将 Pattern.DOTALL 与您的正则表达式一起使用。这意味着 在 dotall 模式下,表达式点 (.) 匹配任何字符,包括行终止符,它将帮助您从多行匹配模式。

String input = "__YOUR__VCARDS__";
Pattern pattern = Pattern.compile("(BEGIN:VCARD.*?END:VCARD)", Pattern.DOTALL);
Matcher m = pattern.matcher(input);
while (m.find()) {
    System.out.println(m.group(1));
}

关于java - 从字符串中获取标记之间的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23114875/

相关文章:

java - 叠加层在 Google MapView 教程 Android 中不起作用

python - 将文本行更改为二进制类型模式

android - 如何在android中定义一个 "On/Off"复选框

android - 特定 Android Activity 的屏幕超时时间更长?

返回特定字母后直到下一个字母的数字的正则表达式

javascript - 如何在 JavaScript 中处理多个新行直到到达空行?

java - 如何在 Java 中重新格式化字符串日期

java - Wildfly 禁用日志记录子系统

java - 保证死锁

android - 在 android 中使用相同的 debug.keystore 更新另一台机器中的应用程序