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
。谢谢,它起作用了!