我正在尝试匹配类似 CSV 文件中的所有新行。问题是巨大的文件总是带有一些断线,例如:
123|some string field|person 123|some optional open comment|324|213
133|some string field|person||324|213
153|some string field|person 123|some comment|324|213
126|some string field|another id|some open and
new line comment|324|213
153|string field|person 123|some comment|324|213
153|string field|person 123|another broken line
comment|324|213
133|field|person||324|213
因此,为了解决这种情况,我使用了以下逻辑:
string ZSUR = File.ReadAllText(filePath);
string originalFilePath = filePath;
// Regular Expression to fix line break issues
Regex RE = new Regex(@"[\r\t\n]+([^0-9\r\t\n]{3}[^|\r\t\n])");
ZSUR = RE.Replace(ZSUR, "$1");
// Backup the original file
string[] backupFilePath = Regex.Split(filePath, @".txt$");
File.Delete(backupFilePath[0] + "_BACKUP.txt");
File.Move(originalFilePath, backupFilePath[0] + "_BACKUP.txt");
// And then save on the same path the fixed file
File.WriteAllText(originalFilePath, ZSUR);
它解决了 90% 的情况,因为正确行的第一部分总是以三位数开头,后跟一个竖线。
但我不知道为什么它与这样的情况不匹配:
126|some string field|another id|some open and
double newlined
123 coment|324|213
153|some string field|person 123|some comment|324|213
153|some string field|person 123|some comment|324|213
153|string field|person 123|Please split this line
31 pcs: 05/03/2013
31|324|213
153|some string field|person 123|some comment|324|213
如您所见,我需要一种不同的方法来解决这个问题。我知道在 N 次之后我有一个管道,那个烦人的评论字段就在那里。那么,有什么方法可以匹配从一行开始的 N 个管道之后的所有新行和类似行吗?
也欢迎其他想法。
编辑:谢谢你们的回答。
我使用以下正则表达式解决了这个问题:
(?<!\|[CA]?\|([0-9]{2}.[0-9]{2}.[0-9]{4})?)[\n\r]+
当然,我的真实文件与发布的示例略有不同,但主要想法只是匹配所有新行 [\n\r]+ 之前没有
(?<! ... )
表达。