我在VCF文件中有非常多的记录,问题是当手机导出时,它添加了带有标记名称的文件。“PHOTO”,当我将这个VCF文件导入到其他手机时,它将该信息附加到名称中字段,导致太长和大的联系人姓名, 我做的一件事是手动查找和删除,但在一个有25000多行的文件中,这很难,
我正在考虑使用REGX并删除,但也有问题,对于某些记录,PHOTO Tag是最后记录然后END:VCARD在某些点ITS,TEL; ..
以下是我采取的样本,只有一条线索,然后休息,我将尝试自己的。
public string RemoveBlockComments(string InputString)
{
string strRegex = @"<regx>";
RegexOptions myRegexOptions = RegexOptions.Multiline;
Regex myRegex = new Regex(strRegex, myRegexOptions);
return myRegex.Replace(strTargetString, "");
}
这是测试数据:
PHOTO;TYPE=PNG;ENCODING=B:/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMoHBwYIDAoMDAsK
CwsNDhIQDQ4KL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx
BhJB
TEL;TYPE=CELL:123456789
我想将所有从PHOTO删除到BhJb(在电话之前)
可能的格式。
电话;
... PHOTO
EMAIL;
... PHOTO
答案 0 :(得分:1)
根据我们的聊天讨论,您似乎需要做两件事:
TEL
,EMAIL
,END
之后的文字(或其他有效值列表中的其他内容)PHOTO
。您可以使用updated method轻松获得2个值:
private static String ReFormat(String str, out String removed)
{
Regex rgx = new Regex(@"(?msi)(?<removed>PHOTO\b.*?)(?=\b(?:TEL|EMAIL|END)\b)");
removed = rgx.Match(str).Groups["removed"].Value;
return str.Replace(removed, string.Empty);
}
在来电者中:
string removed = string.Empty;
string rest = ReFormat("PHOTO;TYPE=PNG;ENCODING=B:/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMoHBwYIDAoMDAsK\r\nCwsNDhIQDQ4KL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\r\nBhJB\r\nTEL;TYPE=CELL:123456789", out removed);
或者我认为您可以使用返回键值对列表的方法:
private static List<KeyValuePair<String, String>> ReFormat(String str)
{
return Regex.Matches(str, @"(?msi)(?<photo>PHOTO\b.*?)(?<tel>\b(?:TEL|EMAIL|END)\b.*?(?=\bPHOTO|$))").Cast<Match>().Select(p=> new KeyValuePair<String, String>(p.Groups["photo"].Value, p.Groups["tel"].Value)).ToList();
}
然后
var my_result = ReFormat("PHOTO;TYPE=PNG;ENCODING=B:/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMoHBwYIDAoMDAsK\r\nCwsNDhIQDQ4KL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\r\nBhJB\r\nTEL;TYPE=CELL:123456789");
var mres1 = ReFormat("PHOTO;..jkh ohfhlahflkhasf fhasof\r\nTel:886886\r\ndataPHOTO:.ljlljhkdsghdsgd\n\rEmail:abc@abc.com..");