【问题标题】:Regex expressions to match text between first comma and the comma before the first number正则表达式匹配第一个逗号和第一个数字之前的逗号之间的文本
【发布时间】:2014-07-23 21:11:19
【问题描述】:

我有一个包含所有英国地区(43000 行)的 csv 文件。 但是,即使字段用逗号分隔,它们也不会被任何内容包围,因此如果字段的内容中有逗号,则导入数据库会失败。

幸运的是,只有一个字段在其内容中包含逗号。 我需要一个正则表达式,可以用来在所有行上选择此字段。

这是一个数据示例:

Aberaman,Rhondda, Cynon, Taf (Rhondda, Cynon, Taff),51.69N,03.43W,SO0101
Aberangell,Powys,52.67N,03.71W,SH8410

这应该看起来像:

Aberaman,"Rhondda, Cynon, Taf (Rhondda, Cynon, Taff)",51.69N,03.43W,SO0101
Aberangell,"Powys",52.67N,03.71W,SH8410

所以我基本上需要选择第二个字段,它位于第一个逗号和第一个数字之前的逗号之间。

我将使用 sublime text 2 来执行这个正则表达式搜索。

【问题讨论】:

  • 为什么你的第二个例子看起来不像Aberangell,"Powys",52.67N,03.71W,SH8410

标签: regex csv


【解决方案1】:

Sublime text2 支持\K

正则表达式:

^[^,]*,\K(.*?)(?=,\d)

替换字符串:

"\1"

DEMO

说明:

  • ^ 断言我们在一行的开头。
  • [^,]* 匹配任何非逗号字符零次或多次。
  • , 文字逗号。
  • \K 之前匹配的字符将被丢弃。
  • (.*?)(?=,\d) 匹配任何零次或多次的字符,后面必须跟, 和一个数字。 ?* 之后进行不情愿的匹配。

【讨论】:

  • 效果很好!谢谢你。也感谢您的解释。总是很高兴了解它的实际工作原理。
【解决方案2】:

您可以尝试捕获组。只需将其替换为 $1"$2"$3\1"\2"\3

^(\w+,)([^\d]*)(,.*)$

Live Demo


您也可以在Notepad++ 中进行操作。

查找内容:^(\w+,)([^\d]*)(,.*)$

替换为:$1"$2"$3

【讨论】:

    【解决方案3】:

    应该能够解决您的问题的正则表达式是:

    ^.*?,(.*?),\d+
    

    这匹配 任何(非贪婪)直到第一个逗号(不会包含在结果中) 然后是第二个逗号之前的任何内容(将在一个组中) 附加条件是第二个逗号后必须有一个数字

    所以你的组在 $1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 2015-07-26
      • 2022-01-05
      • 2016-11-08
      • 1970-01-01
      相关资源
      最近更新 更多