正则表达式 - 如果模式匹配,则替换双引号之间的字符(逗号)
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/
【讨论】:
以上是关于正则表达式 - 如果模式匹配,则替换双引号之间的字符(逗号)的主要内容,如果未能解决你的问题,请参考以下文章