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

Java 从字符串中获取标记之间的字符串,java,android,regex,string,vcf-vcard,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 i

我不太熟悉正则表达式,所以我在这里问它

我有一根这样的线:

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,我想从字符串中逐个获取VCard。所以,我想把它分成多个字符串。我想用
BEGIN:VCARD
END: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模式下,表达式dot(.)匹配任何字符,包括行终止符
,它将帮助您匹配多行的模式

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));
}

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

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));
}
你应该试试。它是一个在Android上运行的Java vCard库

免责声明:我是作者;)

你应该试试。它是一个在Android上运行的Java vCard库


免责声明:我是作者;)

很好,你试过什么了?我想你不需要正则表达式,只要在找到
BEGIN:VCARD
行时开始构建字符串,并在找到
END:VCARD
行时将构建的字符串添加到列表中即可。@nKn检查我编辑的问题。@devnull谢谢你的讽刺。你可以添加之前尝试过的代码示例来避免这种情况。很好,到目前为止你都试了些什么?我想你不需要正则表达式,只要在找到
BEGIN:VCARD
行时开始生成字符串,在找到
END:VCARD
行时将生成的字符串添加到列表中即可。@nKn检查我编辑过的问题。@devnull谢谢你的讽刺。你本可以添加之前尝试过的代码示例来避免这种情况。该死,我是如此接近:)只是错过了
模式.DOTALL
。谢谢,它起作用了!该死,我差一点:)就错过了
模式.DOTALL
。谢谢,它起作用了!