首页 > 解决方案 > 用定义长度的空格分割字符串

问题描述

我需要将地址线分成 3 个部分,每个部分的大小不同。在这种情况下:40、30 和 30 个字符。我想用空格分割输入字符串,所以这很有意义。

(.{1,32})([ ]+.{1,30}){0,1}([ ]+.{1,30}){0,1}为此,我写了一个正则表达式:并在这个网站上尝试过:https ://regex101.com 。有效!

我搬到 Visual Studio 编写一些代码来检查它:

public static void TEST()
{
    List<string> ok = new List<string>();
    List<string> err = new List<string>();

    var lista = GetLista();
    foreach (string dir in lista)
    {
        Regex regex = new Regex(@"(.{1,32})([ ]+.{1,30}){0,1}([ ]+.{1,30}){0,1}");
        dir = dir.Trim();

        GroupCollection cap = regex.Match(dir).Groups;

        if (cap.Count == 0) err.Add(dir);
        else ok.Add($"{dir};{cap[0].Value};{(cap.Count > 1 ? cap[1].Value.Trim() : "")};{(cap.Count > 2 ? cap[2].Value : "")};{(cap.Count > 3 ? cap[3].Value.Trim() : "")}";);
    }

    File.WriteAllLines("ok.txt", txt);
    File.WriteAllLines("er.txt", err);
}

结果大相径庭,根本不匹配。正则表达式在 C# 中是否有所不同?

有没有其他方法可以实现这一目标?


编辑:正则表达式给出不同的地方。


更新:我将提供一个例子。让我们使用这个字符串:“ERIK ADESIR COMPANY LA ISLA DE LA PALMA”。

c# result: "ERIK ADESIR COMPANY LA ISLA DE L";"ERIK ADESIR COMPANY LA ISLA DE L";;

通缉:“ERIK ADESIR COMPANY LA ISLA DE”;“LA PALMA”;“”

我认为问题在于正则表达式没有采用整个字符串,只是其中的一部分。

标签: c#regexvisual-studio

解决方案


您想匹配整个字符串,因此您需要添加锚点,^并且$. 接下来,您需要获取捕获的子字符串,而不是整个 match。请注意,GroupCollection返回所有捕获的组值和整个匹配项作为第一项。因此,您match.Groups将包含 1 + 捕获组值的数量。您需要忽略第一项。

此外,要检查组是否匹配,您需要使用cap[x].Success而不是cap.Count > x.

所以,你需要这样的代码:

foreach (string dir in lista)
{
    var match = Regex.Match(dir, @"^(.{1,32})([ ]+.{1,30})?([ ]+.{1,30})?$");
    if (match.Success)
    {
        var cap = match.Groups;
        ok.Add($"{dir};{cap[1].Value};{(cap[2].Success ? cap[2].Value.Trim() : "")};{(cap[3].Success ? cap[3].Value : "")}");
    }
    else
    {
         err.Add(dir);
    }
}

在线查看C# 演示

List<string> ok = new List<string>();
List<string> err = new List<string>();

var lista = new[] { "ERIK ADESIR COMPANY LA ISLA DE LA PALMA" };
foreach (string dir in lista)
{
    var match = Regex.Match(dir, @"^(.{1,32})([ ]+.{1,30})?([ ]+.{1,30})?$");
    if (match.Success)
    {
        var cap = match.Groups;
        ok.Add($"{dir};{cap[1].Value};{(cap[2].Success ? cap[2].Value.Trim() : "")};{(cap[3].Success ? cap[3].Value : "")}");
    }
    else
    {
         err.Add(dir);
    }
}
Console.WriteLine(string.Join("\n", ok));

输出:

ERIK ADESIR COMPANY LA ISLA DE LA PALMA;ERIK ADESIR COMPANY LA ISLA DE;LA PALMA;

推荐阅读