RegEx只匹配一个特定的列



我有一个.CSV我在一个大文件编辑器(BssEditor)处理:

DOC;NAME;A_TYPE;ADDRESS;NUMBER;COMPLEMENT;NEIGHBORHOOD;CITY;STATE;ZIPCODE
7971530;Obi Wan Kenobi;R;OF THE PITANGUEIRAS;0000731;;MATATU;DUBAI;BA;40255436
7971541;Anakim Skywalker;AV;VISCONDE OF JEQUITINHONHA;0000243;AP 601;GOOD VOYAGE;RECIFE;PE;51021190
7971974;Jabba the Hutt;;DOS ILHEUS;0000118;APT 600;CENTER;FLOWERPOLIS;SC;88010560
7972512;Mando;;JUNDIACANGA;0000037;HOUSE;IPAVA CITY;SAINT PAUL;SP;04950150

列分隔符为;,并且我要匹配NUMBER列开头的所有零,以替换为零。
Ex。:0000731731

很容易匹配所有的^((.*?;){4})0+和替换为$1,但不与环顾四周…
我试过这样的RegEx

/^(?<=.*?;){4}0+/
/(?<=^.*?;.*?;.*?;.*?;)0+/ 

,但是看起来贪心通配符只适用于前看,而不是后看。

有办法吗?
如果有办法,在处理数百万个条目时是否存在性能问题?

向后看中的无限量词仅被少数正则表达式引擎(. NET, Python PyPi模块,较新的Javascript(如V8),但不包括使用boost的notepad++。

如果您正在使用notepad++,则不需要查找或捕获组。您可以重复分号分隔的部分,直到到达数字列,并使用K清除当前匹配缓冲区。

在替换中使用空字符串

^(?:[^;n]*;){4}K0+
  • ^
  • (?:[^;n]*;){4}重复4次匹配任何字符,除了;或换行符,然后匹配;
  • K忘记目前匹配的内容
  • 0+匹配一次或多次零

Regex演示

捕获组解决方案似乎是一个很好的解决方案,您可以使用单个捕获组编写它,并使用否定的字符类代替.*?,以防止一些回溯。

^((?:[^;n]*;){4})0+

在替换使用组1中,通常标记为$1

Regex演示

我不知道BssEditor,但以下工作在notepad++

(?<=;)0+(?=d+;(?:[^;]*;){4}[^;]*?$)

正向前看只用于匹配在该行上恰好有五个分号的字符串。

在处理数百万项时是否存在性能问题?

可能。

相关内容

  • 没有找到相关文章

最新更新