【问题标题】:Replace space with semicolon when more than one with regex用正则表达式替换多个时用分号替换空格
【发布时间】:2015-04-08 13:54:36
【问题描述】:

我尝试了大约 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 个空格。 (它必须是这样的,因为有些行以FFFF 开头不是字母。这是某种我无法识别的标志,但如果我让记事本++ 显示所有标志,我会看到FF。)

所以我得到了

\1: 43034452
\2: LONGSHIRTPAIETTE
\3: 17.30
\4: 27.90
\5: 0110

如预期的那样,但在下一行它停在空间上。如果我将\s 添加到模式中,那么它还会选择单词部分之后的所有空格。而且我显然不能说“只有一个空格”,可以吗?

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

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

【问题讨论】:

    标签: regex


    【解决方案1】:

    试试这个:

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

    注意几点:

    • 在适当的情况下将 *s 收紧为 +,因此您在这些列中强制执行某些字符或实际空格
    • 使用non-capturing group 重复一个单词然后一个空格的一个或多个实例。

    【讨论】:

    • 猜猜我会选择这个,因为在这种情况下,我在最后一个单词的末尾只有一个空格。 :)
    • 是否有可能也在单词中查找逗号?因为我有这样的词:foo,,bar,逗号可以保持原样......
    • @Dwza - 当然,只需将其添加到字符中,即使用[A-Z,]+
    • 这是我正在尝试的,但无论我做什么,它都与这些行不匹配...... :( 请参阅this sample
    • aaarrrg... 没有逗号 ^^ 它是另一个符号。对不起;D
    【解决方案2】:

    使用下面的正则表达式

    ([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+
    【解决方案3】:

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

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

    请参阅DEMO

    【讨论】:

    • 这似乎可以在线工作,但不能在记事本++中使用,如果我使用这个它会跳过很多行,而不是简单地说它需要 2 行并跳过更多行......
    • 请检查更新的正则表达式。我错过了([A-Z ]+)中的空格
    • 其实还可以,但是最后一个字的末尾的空格没有删掉。
    • 你能检查一下吗? ([0-9]+)\s{6,}([A-Z ]+)\s+([0-9\.]+)\s+([0-9\.]+)\s+([0-9]+)(?=\s) 这应该在最后一个单词后给你零个空格。
    • 同样的结果 :) 蝙蝠 thx,我接受了 nicks answere。这对我帮助最大。谢谢你的尝试:)
    猜你喜欢
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 2021-07-04
    • 2019-02-15
    • 1970-01-01
    • 2015-02-21
    相关资源
    最近更新 更多