如何使用Regex.Split()拆分字符串

时间:2016-08-03 15:19:31

标签: c# regex split pattern-matching

我有一个以冒号(:)分隔的字符串,如下所示:

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";,但它不能。

3 个答案:

答案 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)

你真的很棘手,但在这里我能提出什么建议:

  1. 在行的开头和结尾添加:符号
  2. 使用此正则表达式查找所有匹配项(?!<=[0-9]:)(?<=:).+?(?=:)(?!:([0-9]|\\))
  3. create an example表明它确实有效。

    注意(?!:([0-9]|\\))部分。我添加\符号以正确匹配您的文件夹路径。