2013-02-20 81 views
0

在C#中分裂這種字符串的最佳方式是什麼?提取字符串c的部分#

%%x%%a,b,c,d

所以,我結束了與%%和另一種含變量的一切第二%% 的權利之間的值,即var x = "x"; var y = "a,b,c,d"

a,b,c..可能是無限的逗號分隔列表。我需要提取列表和兩個雙百分號之間的值。 (爲了應對無限的一部分,我想也許分離該字符串出來:%%x%%a,b,c,d在這一點上我可以用這樣的東西來獲得X.

var tag = "%%"; 
     var startTag = tag; 
     int startIndex = s.IndexOf(startTag) + startTag.Length; 
     int endIndex = s.IndexOf(tag, startIndex); 
     return s.Substring(startIndex, endIndex - startIndex); 

請問最好的辦法是使用正則表達式或使用大量indexOfsubstring基於TE靜態%%字符做提取?

+1

正則表達式是更好的 – VladL 2013-02-20 16:02:32

+0

不能甌使用'斯普利特(「」)'這個? – 2013-02-20 16:03:25

+1

我不確定我是否按照......你是在這裏輸出2,'x'和'a,b,c,...''還是你想分割定界值,所以你想'x','a','b','c'等等 – psubsee2003 2013-02-20 16:03:47

回答

1

中提取X

如果%%總是在一開始即可;

string s = "%%x%%a,b,c,d,h"; 
s = s.Substring(2,s.LastIndexOf("%%")-2); 
//Console.WriteLine(s); 

其他;

string s = "v,u,m,n,%%x%%a,b,c,d,h"; 
s = s.Substring(s.IndexOf("%%")+2,s.LastIndexOf("%%")-s.IndexOf("%%")-2); 
//Console.WriteLine(s); 

如果你需要一次得到它們,然後使用這個;

string s = "m,n,%%x%%a,b,c,d"; 

var myList = s.ToArray() 
       .Where(c=> (c != '%' && c!=',')) 
       .Select(c=>c).ToList(); 
0

可以使用char.IsLetter讓所有的list of letter

string test = "%%x%%a,b,c,d"; 
var l = test.Where(c => char.IsLetter(c)).ToArray(); 
var output = string.Join(", ", l.OrderBy(c => c)); 
2

考慮到你想要的是「x,a,b,c,d」,Split()函數實際上非常強大,而正則表達式對於這一點來說是過度的。

下面是一個例子:

string test = "%%x%%a,b,c,d"; 
string[] result = test.Split(new char[] { '%', ',' }, StringSplitOptions.RemoveEmptyEntries); 
foreach (string s in result) { 
    Console.WriteLine(s); 
} 

Basicly我們問它雙方「%」和分裂「」而忽略空的結果(如‘%%’的結果。)。這裏的結果:

x 
a 
b 
c 
d 
0

既然你要在不同的變量後%%,一切的價值,你不需要解析CSV,我覺得正則表達式的解決辦法是您最佳的選擇。

var inputString = @"%%x%%a,b,c,d"; 
var regExPattern = @"^%%(?<x>.+)%%(?<csv>.+)$"; 

var match = Regex.Match(inputString, regExPattern); 

foreach (var item in match.Groups) 
{ 
    Console.WriteLine(item);     
} 

有2個名爲組,即xcsv,因此而不僅僅是循環的模式,你可以很容易地通過名稱引用它們,並將它們分配給值:

var x = match.Groups["x"]; 
var y = match.Groups["csv"]; 
1

這會讓你做這一切一氣呵成:

string pattern = "^%%(.+?)%%(?:(.+?)(?:,|$))*$"; 
string input = "%%x%%a,b,c,d"; 
Match match = Regex.Match(input, pattern); 
if (match.Success) 
{ 
    // "x" 
    string first = match.Groups[1].Value; 
    // { "a", "b", "c", "d" } 
    string[] repeated = match.Groups[2].Captures.Cast<Capture>() 
     .Select(c => c.Value).ToArray(); 
} 
+0

我真的很喜歡這種方法,在正則表達式中我仍然非常糟糕,並且看到它對此有很大幫助。即使它不是我最後的方法,但如果輸入變得更復雜,我可能不得不使用這個解決方案。 – JustAnotherDeveloper 2013-02-20 16:25:54