簡體   English   中英

C#:將字符串拆分為字符,數字和定界字符串,然后對其進行處理

[英]C#: split a string into runs of characters, numbers and delimited strings and process it

好吧,我的正則表達式有點生銹,我一直在努力解決這個特殊的問題...

我需要以任何順序拆分和處理包含以下任意數量的字符串:

  • 字符(僅小寫字母)
  • 引用定界字符串
  • 整數

字符串很奇怪(我無法控制它們)。 當字符串中連續有多個數字時,它們之間用逗號分隔。 它們的處理順序必須與原始字符串中出現的順序相同。

例如,一個字符串可能看起來像:

abc20a"Hi""OK"100,20b

使用這個特定的字符串,生成的調用堆棧看起來像:

ProcessLetters( new[] { 'a', 'b', 'c' } );
ProcessInts( 20 );
ProcessLetters( 'a' );
ProcessStrings( new[] { "Hi", "OK" } );
ProcessInts( new[] { 100, 20 } );
ProcessLetters( 'b' );

我能做的就是像CSV一樣對待,您可以一次處理一個字符來構建令牌,但是我認為使用正則表達式可以更輕松地完成令牌處理?

您可以使用或運算符|使正則表達式與三個單獨的選項匹配。 這應該捕獲有效的令牌,並跳過逗號和其他字符。

/[a-z]|[0-9]+|"[^"]"/

您的字符串可以包含轉義引號嗎?

您可以使用此字符串中包含的模式:

@"(""[^""]*""|[a-z]|\d+)"

標記化您提供的輸入字符串。 此模式捕獲了三件事:簡單的帶引號的字符串(不帶引號),小寫字符和一個或多個數字。

如果您帶引號的字符串中可以包含轉義的引號(例如"Hi\\"There\\"""OK""Pilgrim" ),那么您可以使用此模式來捕獲並標記它們以及其余的輸入字符串:

@"((?:""[^""\\]*(?:\\.[^""\\]*)*"")|[a-z]|\d+)"

這是一個例子:

MatchCollection matches = Regex.Matches(@"abc20a""Hi\""There\""""""OK""""Pilgrim""100,20b", @"((?:""[^""\\]*(?:\\.[^""\\]*)*"")|[a-z]|\d+)");

foreach (Match match in matches)
{
    Console.WriteLine(match.Value);
}

返回字符串標記:

a
b
c
20
a
"Hi\"There\""
"OK"
"Pilgrim"
100
20
b

這種方法的優點之一是,您可以僅檢查第一個字符以查看需要將元素放入哪個堆棧。如果第一個字符為alpha,則它將進入ProcessLetters堆棧,如果該字符為數字,則它進入ProcessInts。 如果第一個字符是引號,則在修剪前后引號並調用Regex.Unescape()Regex.Unescape()轉義嵌入的引號后,它將進入ProcessStrings。

static void Main(string[] args)
{
    string test = @"abc20a""Hi""""OK""100,20b";
    string[] results = Regex.Split(test, @"(""[a-zA-Z]+""|\d+|[a-zA-Z]+)");

    foreach (string result in results)
    {
        if (!String.IsNullOrEmpty(result) && result != ",")
        {
            Console.WriteLine("result: " + result);
        }
    }
    Console.ReadLine();
}

暫無
暫無

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

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