在Notepad++中使用正则表达式替换逗号分隔的空格。

8

我有以逗号分隔的令牌,需要将它们转换为以冒号分隔并用空格隔开的令牌。我想在Notepad++中使用正则表达式,但遇到了问题。

我的输入是:

aaaaa, bbb ,cccc, hhhh, fff,t

我想要的结果是:

aaaaa     bbb       cccc     hhhh      fff       t

每个令牌正好包含10个字符。
我的问题是如何使输出正好为10个字符?

我认为正则表达式无法按照你想要的方式进行计数和数学运算... - Markus Hütter
1
你最好使用一种编程语言,具有回调功能(Python中的re.sub()PHP中的preg_replace_callback())。 - Jan
这可以分为两步完成,首先用大量空格替换逗号。其次,收集10个字符以及所有尾随空格,并仅替换为这10个字符。如果文件末尾包含一个空格,则我认为可以在1步中完成,但是添加该空格可能被视为额外的步骤,因此我猜最少需要2步。 - Ro Yo Mi
2
这个问题不是Toto指出的那个重复问题。 - Ro Yo Mi
3个回答

8

描述

我认为这是一个分两步走的过程。第一步,将所有逗号替换为10个空格。第二步,捕获10个字符和所有尾随空格,并仅用捕获的10个字符进行替换。


第一步 - 将逗号替换为10个空格

,\s*|\s*$

正则表达式可视化

替换为: __________ 这些是下划线,但你应该使用十个或更多空格。

演示: https://regex101.com/r/mR1eS9/1

样本文本

aaaaa, bbb ,cccc, hhhh, fff,t

替换后

aaaaa          bbb           cccc          hhhh          fff          t                    
123456789,123456789,123456789,123456789,123456789,123456789,123456789,123456789

步骤二 - 获取10个字符和所有尾随的空格

注:我在这里插入了一个数字行,以帮助说明字符的数量和位置


(.{10})[^\S\n\r]*

正则表达式可视化

替换为: $1

现场演示: https://regex101.com/r/uL8oO7/2

示例文本

因为这是第二步,所以示例文本是上述第一步的输出。

aaaaa          bbb           cccc          hhhh          fff          t                    

替换后

aaaaa     bbb       cccc      hhhh      fff       t         
123456789,123456789,123456789,123456789,123456789,123456789,123456789,123456789

注意:我在这里插入了数字行,以帮助说明字符的数量和位置


(Note: 我在这里插入数字行以帮助说明字符的数量和位置)

在第一步中,只需搜索替换所有逗号为10个空格即可 :-)。 - Davidfi1
当然,那也可以,但我想确保空格也被添加到每行的末尾。我猜步骤一可以简化为,|$ - Ro Yo Mi

6

正则表达式计算模型非常简单,无法进行计数。但是,在只有九种可能的非空匹配的情况下,您可以运行九个单独的全局替换来覆盖所有可能性(为了清晰起见,在空格的位置使用下划线_):

Search         Replacement
-------------  -----------
(?<=\b\S{9}),\s  _
(?<=\b\S{8}),\s  __
(?<=\b\S{7}),\s  ___
(?<=\b\S{6}),\s  ____
...
(?<=\b\S{1}),\s  _________

每次替换操作都匹配一个逗号和一个空格,这些逗号和空格跟随着 x 个非空格字符,并将它们替换为 10-x 个空格。

2

也许使用一种编程语言的解决方案更易于阅读和理解。
在下面找到了 PHPPython 的代码示例(也可以轻松地适用于其他语言):

PHP

<?php
$string = "aaaaa, bbb ,cccc, hhhh, fff,t";
$regex = '~(\w+)(\s*,|$)~';
# look for word characters, followed by spaces (or not) 
# and a comma or the end of the string

$string = preg_replace_callback(
    $regex,
    function($match) {
        return str_pad($match[1], 10);
    },
    $string);
echo $string;
# aaaaa      bbb       cccc       hhhh       fff       t         
?>

查看在ideone.com上的演示


Python

import re

string = "aaaaa, bbb ,cccc, hhhh, fff,t";

def repl(match):
    return match.group(1).ljust(10)

rx = r'(\w+)(\s*,|$)'
string = re.sub(rx, repl, string)
print string

这里还有一个在ideone.com上的示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接