private static AhoCorasick BuildAhoCorasick(SqlXml xml, SqlString culture) { var xe = XElement.Load(xml.CreateReader()); var words = xe.Elements().Select(e => e.FirstAttribute.Value); var c = culture.Value.Split(':'); var ignoreCase = c.Length > 1 && c[1] == "i"; CharComparer cc; switch (c[0]) { case "c": cc = CharComparer.Create(CultureInfo.CurrentCulture, ignoreCase); break; case "n": cc = CharComparer.Create(CultureInfo.InvariantCulture, ignoreCase); break; case "o": case "": cc = ignoreCase ? CharComparer.OrdinalIgnoreCase : CharComparer.Ordinal; break; default: cc = CharComparer.Create(CultureInfo.GetCultureInfo(c[0]), ignoreCase); break; } var ac = new AhoCorasick(cc, words); return(ac); }
public void OverloadsTest() { var ac = new AhoCorasick(new List <string> { "a" }); CollectionAssert.AreEqual(new WordMatchList { { 0, "a" } }, ac.Search("a").ToList()); Assert.AreEqual(0, ac.Search("b").Count()); ac = new AhoCorasick(CharComparer.OrdinalIgnoreCase, new List <string> { "a", "ab", "bab", "bC", "bca", "c", "caa" }); var m = ac.Search("abCcab").ToList(); var expected = new WordMatchList { { 0, "a" }, { 0, "ab" }, { 1, "bC" }, { 2, "c" }, { 3, "c" }, { 4, "a" }, { 4, "ab" } }; CollectionAssert.AreEqual(expected, m); ac = new AhoCorasick(); ac.Add("a"); ac.BuildFail(); CollectionAssert.AreEqual(new WordMatchList { { 0, "a" } }, ac.Search("a").ToList()); Assert.AreEqual(0, ac.Search("b").Count()); ac = new AhoCorasick(CharComparer.Create(CultureInfo.InvariantCulture, true), "a", "ab", "bab", "bc", "bca", "c", "caa"); m = ac.Search("abccab").ToList(); expected = new WordMatchList { { 0, "a" }, { 0, "ab" }, { 1, "bc" }, { 2, "c" }, { 3, "c" }, { 4, "a" }, { 4, "ab" } }; CollectionAssert.AreEqual(expected, m); }