用定义长度的空格分割字符串

安东尼奥·罗德里格斯(Antonio Rodriguez)

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

为此,我写了一个reular表达式:(.{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#结果:“ ERIK ADESIR COMPANY LA ISLA DE L”;“ ERIK ADESIR COMPANY LA ISLA DE L”;

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

我认为问题在于正则表达式不能完全使用整个字符串,而只是其中一部分。

维克多·史翠比维

您要匹配整个字符串,因此需要添加锚点^$接下来,您需要获取捕获的子字符串,而不是整个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;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用空格分割字符串?

来自分类Dev

用随机空格分割字符串

来自分类Dev

用任意数量的空格分割字符串

来自分类Dev

用修剪的空格C#分割字符串

来自分类Dev

用空格在Java中分割字符串数据

来自分类Dev

用点和空格分割字符串

来自分类Dev

用定义的字符数限制字符串长度

来自分类Dev

字符串按长度分割,仅按最近的空格分割

来自分类Dev

字符串长度,以空格分隔

来自分类Dev

用“,”分割字符串

来自分类Dev

用“。”分割字符串

来自分类Dev

根据长度分割字符串

来自分类Dev

根据所需长度分割字符串

来自分类Dev

根据“”和空格分割字符串

来自分类Dev

循环字符串按空格分割

来自分类Dev

python在空格上分割字符串

来自分类Dev

按空格分割字符串

来自分类Dev

按空格分割字符串,Java

来自分类Dev

分割字符串,空格数可变

来自分类Dev

在空格上分割字符串

来自分类Dev

按空格分割字符串

来自分类Dev

按空格分割字符串

来自分类Dev

根据“”和空格分割字符串

来自分类Dev

用空格字符分割字符串(基本名称奇怪的问题)

来自分类Dev

NET字符串长度用多行分割多行文本框文本

来自分类Dev

NET字符串长度用多行分割多行文本框文本

来自分类Dev

java regex用空格分割字符串(左和右均为数字或-时除外)

来自分类Dev

Python用空格分割字符串,除非在前面加上\

来自分类Dev

使用正则表达式用空格分割字符串