摘要:[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));
}
}