我有一个以冒号(:
)分隔的字符串,如下所示:
string str = @"E:\C_Sharp\Projects\Split\test.xlsx:03/08/2016
09:12:56:file name 1,demo1.txt,date create,01/07/2016 09:12:file name
2,demo2.txt,date create,12/07/2016 14:05";
现在我想分成4个子字符串,如下所示:
str1 = @"E:\C_Sharp\Projects\Split\test.xlsx";
str2 = "03/08/2016 09:12:56"
str3 = "file name 1,demo1.txt,date create,01/07/2016 09:12"
str4 = "file name 2,demo2.txt,date create,12/07/2016 14:05"
我使用了模式string pattern = @"\D:\D";
,但它不能。
答案 0 :(得分:0)
首先,您的模式不正确。根据你提供的字符串,它应该是\D:\d|\d:\D
,即你想要找到冒号的出现,一边是数字,另一边是非数字。
第二个问题是Regex.Split
将删除搜索模式的所有出现,因此分隔符位置的冒号周围的字符将丢失。您可以通过将分隔符模式替换为某个字符来避免它,该字符将永远不会出现在字符串中,然后由此字符分割。
因此,您可以提取您的值,如:
string str = @"E:\C_Sharp\Projects\Split\test.xlsx:03/08/2016 09:12:56:file name 1,demo1.txt,date create,01/07/2016 09:12:file name 2,demo2.txt,date create,12/07/2016 14:05";
var values = Regex.Replace(str, @"\D:\d|\d:\D", m => m.Groups[0].Value.Replace(":", "\0"))
.Split('\0');
答案 1 :(得分:0)
我建议用更好的分隔符替换冒号,然后拆分它。
要仅替换应拆分的冒号,可以使用此正则表达式:
(?<=\d\d):(?=\D)|(?<=\D):(?=\d\d)
使用您知道的某些字符不会出现在字符串的其他位置。然后,你只需要拆分那个角色。
它有点脆弱,因为如果文件名为1filename
,它可能会中断,但这取决于您的情况。
正则表达式使用正面的外观:(?<=)
是向后看,(?=)
是向前看。
答案 2 :(得分:0)
你真的很棘手,但在这里我能提出什么建议:
:
符号(?!<=[0-9]:)(?<=:).+?(?=:)(?!:([0-9]|\\))
我create an example表明它确实有效。
注意(?!:([0-9]|\\))
部分。我添加\
符号以正确匹配您的文件夹路径。