2015-10-22 101 views
3

我想解析一個字符串,並由一些分隔符分割它,還包括分隔符。如何根據其內容拆分字符串?

例如,從字符串if(a>b) write(a);我想if(a>b)write(a);

這裏是我試過:

string pattern = "(" + String.Join("|", delimiters.Select(d =>Regex.Escape(d)).ToList()) + ")"; 
List<string> result = Regex.Split(line, pattern).ToList(); 

它的工作,但它在某些情況下失敗。如果我有字符串if(a>0) write("it is positive");我不想得到"it,is,positive"(因爲空格是分隔符),但是"it is positive"。我怎樣才能做到這一點?

+1

你只是想匹配C-字符串?這是一個解決的問題,在這裏有很多這樣的問題。嘗試添加['@「」「[^」「\\] *(?:\\。[^」「\\] *)*」「」'](http://regexstorm.net/tester?p= %22%圖5b%5E%22%5C%5C%5D *(%3F%3A%5C%5c所示。%圖5b%5E%22%5C%5C%5D *)*%22 I =%22some%5cnstring%22) 。 –

+0

不僅可以匹配,還可以拆分字符串。 – user1012732

+1

http://stackoverflow.com/questions/2484919/how-do-i-split-a-string-by-strings-and-include-the-delimiters-using-net –

回答

2

匹配C字符串可以與已知的正則表達式來實現:

"[^"\\]*(?:\\.[^"\\]*)*" 

regex demo

將其納入你的代碼,你只需要在正則表達式添加到分隔符列表,但你需要把它作爲捕獲組的第一個選擇。

var delimiters = new List<string> { " ", "(", ")", ">", "<", ",", ";"}; 
var line = "if(a>b) write(\"My new result\")"; 
var escaped_delimiters = new List<string>(); 
escaped_delimiters.Add(@"""[^""\\]*(?:\\.[^""\\]*)*"""); 
escaped_delimiters.AddRange(delimiters.Select(d => Regex.Escape(d)).ToList()); 
var pattern = "(" + String.Join("|", escaped_delimiters) + ")"; 
var result = Regex.Split(line, pattern).Where(x => !String.IsNullOrWhiteSpace(x)).ToList(); 

IDEONE demo

如果你需要沒有空的元素,使用

List<string> result = Regex.Split(line, pattern).Where(x => !string.IsNullOrWhiteSpace(x)).ToList(); 

其結果將是

enter image description here

1

我建議你做匹配而不是使用下面的正則表達式分割。

@"(?:""[^""]*""|\w|[^\w\s])+"