我有一个.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。:0000731→731
很容易匹配所有的^((.*?;){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}[^;]*?$)
正向前看只用于匹配在该行上恰好有五个分号的字符串。
在处理数百万项时是否存在性能问题?
可能。