【问题标题】:How to split string using Regex.Split()如何使用 Regex.Split() 拆分字符串
【发布时间】:2016-08-03 15:19:31
【问题描述】:

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

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

【问题讨论】:

  • 字符串应该在什么时候被分割?

标签: c# regex split pattern-matching


【解决方案1】:

首先,您的模式不正确。根据您提供的字符串,它应该是\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');

【讨论】:

  • 我明白了。谢谢!
  • string str1 = @"E:\C_Sharp\Projects\Split\test.xlsx:03/08/2016 09:12:56:文件名 1,demo1.txt,日期创建 1,01 /07/2016 09:12,author1,:文件名 2,demo2.txt,创建日期 2,12/07/2016 14:05,author2,petter c:\england:文件名 3,demo3.txt,创建日期3,19/09/2009 19:09,,"; var values1 = Regex.Replace(str1, @"\D:\d|\d:\D|\D:\D", m => m.Groups[0].Value. Replace(":", "\0")) .Split('\0'); => 不正确的结果,有什么建议吗?谢谢!
  • @MinhKiyo 好吧,如果您的问题出在字符串的 author1,:file name 2 部分,我可以假设,您可以尝试使用像 [\D,]:\d|[\d,]:\D 这样的正则表达式模式来处理这种情况。
  • 安迪科尼耶夫,谢谢!我试图处理正则表达式模式 [\D,]:\d|[\d,]:\D ,但它不能。结果图片:i1177.photobucket.com/albums/x356/kiyo2913/…。任何帮助将不胜感激。
  • @MinhKiyo 它肯定不会分裂,因为你从未提到过这种情况(冒号两边的字母)。好吧,它让我们回到您尝试使用的\D:\D 模式,但它会分裂太多,例如它会分裂“e:\”所以你需要排除斜杠和其他可能不需要的字符,比如@ 987654329@。这是必不可少的最后一部分-“除数字或反斜杠之外的所有内容,然后是冒号,然后是除数字或反斜杠之外的所有内容”。如果它仍然无法满足您的某些边缘情况......好吧,调整它。 ;)
【解决方案2】:

我建议用更好的分隔符替换冒号,然后在上面拆分。

要仅替换应拆分的冒号,您可以使用此正则表达式:

(?<=\d\d):(?=\D)|(?<=\D):(?=\d\d)

使用一些你知道不会出现在字符串其他地方的字符。然后,您只需要在该字符上进行拆分。

它有点脆弱,因为如果文件名是1filename,它可能会损坏,但这取决于你的情况。


正则表达式使用正面环视:(?&lt;=) 是向后看,(?=) 是向前看。

【讨论】:

  • 感谢您的回复!
【解决方案3】:

你遇到了非常棘手的情况,但我可以建议:

  1. 在行首和行尾添加 : 符号
  2. 使用此正则表达式查找所有匹配项(?!&lt;=[0-9]:)(?&lt;=:).+?(?=:)(?!:([0-9]|\\))

create an example 表明它确实有效。

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

【讨论】:

  • 感谢您的回复!
猜你喜欢
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
  • 2013-01-14
  • 2020-08-03
  • 1970-01-01
相关资源
最近更新 更多