簡體   English   中英

用定義長度的空格分割字符串

[英]Split string by spaces with defined length

我需要將地址線分成 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# 結果:"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 .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));

Output:

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

問題可能是您在 c# 中給定的正則表達式

new Regex(@"(.{1,40})([ ]+.{1,30}){0,1}([ ]+.{1,30}){0,1}");

不等於您用作測試的那個:

(.{1,32})([ ]+.{1,30}){0,1}([ ]+.{1,30}){0,1}

在 c# 中,您以 (.{1, 40 } 開頭,但您的示例是 (.{1, 32 })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM