如何使用Regex拆分字符串.Split()
本文关键字:Split 字符串 拆分 何使用 Regex | 更新日期: 2023-09-27 17:59:55
我有一个用冒号(:
)分隔的字符串,如下所示:
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";
,但它不能。
首先,您的模式不正确。根据您提供的字符串,它应该是'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');
我建议用更好的分隔符替换冒号,然后在此基础上进行拆分。
要只替换应该拆分的冒号,可以使用以下regex:
(?<='d'd):(?='D)|(?<='D):(?='d'd)
使用某个您知道不会出现在字符串其他位置的字符。然后,你只需要在这个角色上分开。
它有点脆弱,因为如果文件名是1filename
,它可能会崩溃,但这取决于您的情况。
正则表达式使用正向环视:(?<=)
是向后看,(?=)
是向前看。
你遇到了非常棘手的情况,但这里我能建议什么:
- 在行首和行尾添加
:
符号 - 使用此正则表达式查找所有匹配的
(?!<=[0-9]:)(?<=:).+?(?=:)(?!:([0-9]|''))
我创建了一个例子来证明它确实有效。
注意(?!:([0-9]|''))
部分。我添加了'
符号来匹配您的文件夹路径。