正则表达式缩进 - 将制表符保留在行首

本文关键字:保留 行首 制表符 缩进 正则表达式 | 更新日期: 2023-09-27 18:31:01

我在C#中使用正则表达式。我想将匹配项移动到新行并缩进。通过缩进,我的意思是应该保留并添加预先存在的选项卡,这些选项卡存在于包含匹配项的行的开头。

使用一个正则表达式匹配和替换来做到这一点的最佳方法是什么?

例如,匹配逗号后面的单词:

W 1, 2, 3
    W 4, 5, 6
        W 7, 8, 9

应导致:

W 1,
    2,
    3
    W 4,
        5,
        6
        W 7,
            8,
            9

我可以匹配(?<=,),只需用'n甚至'n't替换即可。但是,使用此方法时,每个匹配项的缩进都会重置为一个制表符,并且不遵循预先存在的缩进。

我还尝试使用命名组,例如通过(?<tabs>^'t+|'n't+)查看现有缩进,以及通过(?<words>(?<=,))缩进的匹配项。但是,我不知道如何将其组合成一个匹配和一个替换正则表达式模式。

正则表达式缩进 - 将制表符保留在行首

这是我想到的。 它不使用任何正则表达式,因为此问题不需要使用它们。 您可以自己决定这是否适合您:)

工作点小提琴

var input =
@"W 1, 2, 3
    W 4, 5, 6
        W 7, 8, 9";
var output = string.Empty;
var inputLines = input.Split(''n');
foreach(var inputLine in inputLines) {
    // get leading whitespace for line... you can use Regex here to match
    // more WS characters if you'd like
    var leadingWsAmt = inputLine.Length - inputLine.TrimStart(' ').Length;
    var leadingWs = new string(' ', leadingWsAmt);
    // trim all strings separated by comma so whitespace is correct in final result
    var inputsOnLine = inputLine
        .Split(',')
        .Select(x => x.Trim());
    output += string.Join(",'n"+leadingWs+"'t", inputsOnLine);
    // don't put comma after last item
    output += "'n"+leadingWs+"'t";
}
output = output.Trim();
Console.WriteLine(output);
// W 1,
//     2,
//     3
//     W 4,
//         5,
//         6
//         W 7,
//             8,
//             9