[英]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.