2015-06-30 107 views
5

解析FTX(自由文本)字符串時,我需要使用+作爲分隔符來分割它,但僅當它沒有以轉義字符(例如?)開頭時。 所以這個字符串nika ?+ marry = love+sandra ?+ alex = love應該被解析爲兩個字符串:nika + marry = lovesandra + alex = love。 使用String.Split('+')顯然是不夠的。我能以某種方式實現它嗎?自定義分析字符串

的一種方式,在我看來,是有一些獨特的字符(或字符的繼承),以取代?+出現,比方說,@#@,採用分體式「+」作爲分隔符,然後更換@#@+,但是這是不可靠的,而且我可以想到的任何可能的方式都是錯誤的。

?僅作爲轉義字符與:+組合使用,在任何其他情況下,它都被視爲常規字符。

+2

您可以嘗試使用正則表達式這一點。 –

+0

你能更具體嗎? – nicks

+1

如果在單詞/句子中存在「?+」,會發生什麼?那麼你的邏輯代替'「?+」'不起作用.. –

回答

3

一種可怕的正則表達式來分割它:

string str = "nika ?+ marry = love??+sandra ???+ alex = love"; 
string[] splitted = Regex.Split(str, @"(?<=(?:^|[^?])(?:\?\?)*)\+"); 

它分割的是+(\+),其由所述弦(^)或非?字符([^?])的開始之前的加偶數?(?:\?\?)*)。有一個自由使用(?:)(非捕獲組),因爲Regex.Split做有趣的事情,如果有多個捕獲組。

請注意,我沒有做unescape!所以最後?+仍然是?+

+0

如果字符串以'?+'結尾怎麼辦?我現在不應該返回任何東西或空字符串。你沒有返回,我的返回空字符串。也爲可怕的正則表達式+1! – dotctor

+0

@dotctor我沒有做這個... – xanatos

1
using System; 
using System.Collections.Generic; 
using System.Text.RegularExpressions; 

public class Program 
{ 
    public static void Main() 
    { 
     string s = "nika ?+ marry = love+sandra ?+ alex = love"; 
     string[] result = Regex.Split(s, "\\?{0}\\+", RegexOptions.Multiline);     
     s = String.Join("\n", result);  
     Regex rgx = new Regex("\\?\\n"); 
     s = rgx.Replace(s, "+"); 
     result = Regex.Split(s, "\\n", RegexOptions.Multiline);       
     foreach (string match in result) 
     { 
      Console.WriteLine("'{0}'", match); 
     } 
    } 
} 

輸出

'nika + marry = love' 
'sandra + alex = love' 

https://dotnetfiddle.net/HkcQUw