我正在尝试大约2个小时,我不确定我想做的事情是否有效。
我有一个大文件,其中包含一些看起来像
的数据43034452 LONGSHIRTPAIETTE 17.30
27.90
0110
COLOR : : : : :
: : :
-11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
43034453 LONG SHIRT PAI ETTE 16.40
25.90
0110
COLOR : : : : :
: : :
-3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
43034454 BASIC 4.99
8.90
0110
COLOR : : : : :
: : :
-5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
(该文件有36k行。)
我想做的是让整件事情变得干净。
最后,行应该看起来像
43034452;LONGSHIRTPAIETTE;17.30;27.90;0110
43034453;LONG SHIRT PAI ETTE;16.40;25.90;0110
43034454;BASIC;4.99;8.90;0110
所以有很多我不需要的数据。我正在使用Notepad ++来做我的正则表达式。
我的正则表达式字符串目前看起来像([0-9]*)\s{6,}([A-Z]*)\s*([0-9\.]*)\s*([0-9\.]*)\s*([0-9]*)
。
这给我带来了第一个数字后跟6个空格。 (它必须是这样的,因为有些行以FF
开头,FF
不是字母。这是某种我无法识别的标志,但如果我让Notepad ++显示所有符号,我会看到{{ 1}}。)
因此我得到了
FF
像预期的那样,但在下一行它停在空间上。如果我将\1: 43034452
\2: LONGSHIRTPAIETTE
\3: 17.30
\4: 27.90
\5: 0110
添加到模式中,那么它还会选择单词部分之后的所有空格。我显然不能说“只有一个空间”,可以吗?
所以我的问题是,我可以使用正则表达式来获得我想要的选择吗?
如果是这样,我做错了什么?
答案 0 :(得分:1)
使用以下正则表达式
([0-9]*)\s{6,}([A-Z]+(?:\s+[A-Z]+)*)\s*([0-9\.]*)\s*([0-9\.]*)\s*([0-9]*).*?(?=\n\S|$)
然后将匹配替换为\1;\2;\3;\4;\5
不要忘记启用DOTALL修饰符s
。
答案 1 :(得分:1)
试试这个:
([0-9]+)\s{6,}((?:[A-Z]+\ )+)\s*([0-9\.]+)\s+([0-9\.]+)\s+([0-9]+)
请注意以下几点:
*
收紧到适当的+
,这样您就可以在这些列或实际空格中强制执行某些字符答案 2 :(得分:1)
您的方法是正确的..只需在您的正则表达式中将*
替换为+
(多个)。
/([0-9]+)\s{6,}([A-Z ]+)\s+([0-9\.]+)\s+([0-9\.]+)\s+([0-9]+)/g
请参阅DEMO。