使用正则表达式多个时,用分号替换空格

时间:2015-04-08 13:54:37

标签: regex

我正在尝试大约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 添加到模式中,那么它还会选择单词部分之后的所有空格。我显然不能说“只有一个空间”,可以吗?

所以我的问题是,我可以使用正则表达式来获得我想要的选择吗?

如果是这样,我做错了什么?

3 个答案:

答案 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

DEMO

答案 1 :(得分:1)

试试这个:

([0-9]+)\s{6,}((?:[A-Z]+\ )+)\s*([0-9\.]+)\s+([0-9\.]+)\s+([0-9]+)

请注意以下几点:

  • *收紧到适当的+,这样您就可以在这些列或实际空格中强制执行某些字符
  • 使用non-capturing group重复单词然后空格
  • 的一个或多个实例。

答案 2 :(得分:1)

您的方法是正确的..只需在您的正则表达式中将*替换为+(多个)。

/([0-9]+)\s{6,}([A-Z ]+)\s+([0-9\.]+)\s+([0-9\.]+)\s+([0-9]+)/g

请参阅DEMO