正则表达式 - 如果模式匹配,则替换双引号之间的字符(逗号)

Posted

技术标签:

【中文标题】正则表达式 - 如果模式匹配,则替换双引号之间的字符(逗号)【英文标题】:Regex - replace a characters(comma) between double quotes if the pattern is matched 【发布时间】:2011-05-20 18:26:13 【问题描述】:

我有这个来自 Exchange 服务器的日志

2010-05-20T01:53:33.097Z,12.10.53.144,,12.10.53.200,EXHUB-10,08CCC3F50C35F2D2;2010-05-20T01:53:32.128Z;0,EXHUB-10\Default EXHUB-10,SMTP,RECEIVE,829888,,norma@ccc.gov.my,,521647,1,,,"NEAC 工作小组会议 - 升级 劳动力的技能和 加强职业技术 培训 - 5 月 24 日星期一下午 2:30, 2010",lee.cheesung@gmail.com,,00A:

我使用这个正则表达式来匹配和分组模式;

(\d4-\d2-\d2)(?:[\w\s]+)(\d+:\d+:\d+.\d+)(?:[ \w+\d.]*),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?) ,(.*?),(.*?),(.*?),(.*?),(['"].*['"]|.*?),(.*?),(. *?),(.*?),(.*?),(.*?),(.*?),(.*?),(?:(\d4-\d2- \d2\w\d2:\d2:\d2.\d+)(?:\w+)*)*(.*)

基本上,日志中的信息是用逗号分隔的。 不幸的是,对于“电子邮件主题”字段,如果用户输入逗号,则日志将出现在双引号中,例如上面的示例-日期格式的逗号"Monday May 24, 2010"

.....521647,1,,,"NEAC 子工作 小组会议 - 提升技能 劳动力和增强职业 和技术培训 - 周一下午 2:30 5月24日, 2010",lee.keesung@gmail.com,.....

如何在特定组(第 19 组)中不带双引号的情况下用逗号抓住整个主题

【问题讨论】:

CSV是不规则语言,不能用正则表达式解析。 【参考方案1】:

您提供的行似乎是 CSV 格式。为什么不使用 CSV 解析器来解析它,例如:

http://opencsv.sourceforge.net/ http://supercsv.sourceforge.net/

【讨论】:

【参考方案2】:

你提到:

基本上就是日志中的信息 由逗号分隔...如果逗号是字段的一部分,则该字段将被双引号括起来。

这使它成为CSV 文件。解析 CSV 文件是一个已解决的问题,您无需重新发明***。使用您的语言库提供的 CSV 解析器。

如果您使用 Perl,请查看 Text::CSV 模块。

【讨论】:

第二 - 我一直使用Text::CSV,或者更准确地说,Text::CSV_XS 相同但更快。【参考方案3】:

对于 java 使用 Apache commons:

http://commons.apache.org/sandbox/csv/

【讨论】:

以上是关于正则表达式 - 如果模式匹配,则替换双引号之间的字符(逗号)的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式

正则表达式删去双引号vscode

字符串匹配正则表达式模式并替换为匹配的问题

php 正则表达式中的 .*? 表示什么意思?

正则表达式匹配引号外的逗号 - XML 模式变体

Linux正则表达式中单引号双引号及不加引号的区别