[Regular expression] 不切割引號內的字串

  • 3162
  • 0

摘要:[Regular expression] 不切割引號內的字串

 

※本文的重點在於字串分割,不對搜尋引擎的分析進行討論
 
根據一般使用者的習慣,如果要搜尋多個關鍵字時
 
我們通常會輸入空白鍵來做為不同關鍵字的分割
 
所以我們第一個字串處理的方式可能會像這樣
 
 

 string keyword ="Mary Tom Allen";
string[] names = keyword.Split(' ');

// 輸出結果 (三組)
//Mary
//Tom
//Allen
 
那如果今天有個關鍵字本身就含空白符號,像是人名 "John Lennon"
 
上述的寫法就不適用了,字串會被切成兩個
 
那我們希望使用者對於不想分割的關鍵字加上引號作為依據
 
當然這應該也是目前大家的使用習慣了
 
或許會改寫成下方的寫法讓我們找到引號內的關鍵字
 

 string keyword = @"""John Lennon""";
string keywordNew = keyword.Replace('"', ' ').Trim();

// 輸出結果 (一組)
//John Lennon
 
 
 
 
但是使用者輸入的東西總沒這麼單純,他可能在一次的輸入當中同時使用空白分割,同時又使用引號包覆特定字串
 
像這樣
 
Mary "Mariah Carey" Tom Allen "John Lennon"
 
我們應該會預期分割成五組人名,分別為
Mary
Mariah Carey
Tom
Allen
John Lennon
 
 
針對上述問題,我們可以採用正規表示式來因應
 

 static void Main(string[] args)
        {
            string keyword = @"Mary ""Mariah Carey"" Tom Allen ""John Lennon""";
            RunSplit(keyword);
            Console.ReadLine();
        }

static void RunSplit(string input)
{
string pattern = "(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))";

MatchCollection matchs = Regex.Matches(input, pattern, RegexOptions.IgnoreCase);


Console.WriteLine("\nSource : " + input + "\n");
foreach (Match match in matchs)
{

string str = match.Value;
if (string.IsNullOrEmpty(str))
continue;

str = str.Replace('"', ' ').Trim();
if(match.Success)
Console.WriteLine(string.Format("=> {0}", str));
}
}