using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; namespace RegexNegativePatternsForString { internal class Program { public static void Main() { // // 「文字列 ab を含まない」という正規表現は // ^([^a]*a+[^ab])*[^a]*a*$ // であってるのかテスト // string ng_word2 = "ab"; Regex regex2 = new Regex(@"^([^a]*a+[^ab])*[^a]*a*$"); Test(regex2, ng_word2); } static void Test(Regex regex, string ng_word) { // aからz var a2z = Enumerable.Range(0, 26).Select(it => Convert.ToChar('a' + it)); // 任意の2文字でテスト StringBuilder sb = new StringBuilder(); foreach (var item in DP(a2z, a2z)) { sb.Clear(); sb.Append(item.Item1); sb.Append(item.Item2); string input = sb.ToString(); Test(input, regex, ng_word); } // 任意の3文字でテスト foreach (var item in DP(a2z, a2z, a2z)) { sb.Clear(); sb.Append(item.Item1); sb.Append(item.Item2); sb.Append(item.Item3); string input = sb.ToString(); Test(input, regex, ng_word); } // 任意の4文字でテスト foreach (var item in DP(a2z, a2z, a2z, a2z)) { sb.Clear(); sb.Append(item.Item1); sb.Append(item.Item2); sb.Append(item.Item3); sb.Append(item.Item4); string input = sb.ToString(); Test(input, regex, ng_word); } // 任意の5文字でテスト foreach (var item in DP(a2z, a2z, a2z, a2z, a2z)) { sb.Clear(); sb.Append(item.Item1); sb.Append(item.Item2); sb.Append(item.Item3); sb.Append(item.Item4); sb.Append(item.Item5); string input = sb.ToString(); Test(input, regex, ng_word); } Console.WriteLine("===== PASS! NG-word: {0} =====", ng_word); } static void Test(string input, Regex regex, string ng) { bool actual = regex.IsMatch(input); bool expected = !input.Contains(ng); if (actual != expected) { string errMsg = string.Format("assertion failure! input: {0}, regex: {1}, NG-word: {2}", input, regex.ToString(), ng); throw new Exception(errMsg); } } static IEnumerable> DP(IEnumerable set1, IEnumerable set2) { foreach (var item1 in set1) { foreach (var item2 in set2) { yield return Tuple.Create(item1, item2); } } } static IEnumerable> DP(IEnumerable set1, IEnumerable set2, IEnumerable set3) { foreach (var item1 in set1) { foreach (var item2 in set2) { foreach (var item3 in set3) { yield return Tuple.Create(item1, item2, item3); } } } } static IEnumerable> DP(IEnumerable set1, IEnumerable set2, IEnumerable set3, IEnumerable set4) { foreach (var item1 in set1) { foreach (var item2 in set2) { foreach (var item3 in set3) { foreach (var item4 in set4) { yield return Tuple.Create(item1, item2, item3, item4); } } } } } static IEnumerable> DP(IEnumerable set1, IEnumerable set2, IEnumerable set3, IEnumerable set4, IEnumerable set5) { foreach (var item1 in set1) { foreach (var item2 in set2) { foreach (var item3 in set3) { foreach (var item4 in set4) { foreach (var item5 in set5) { yield return Tuple.Create(item1, item2, item3, item4, item5); } } } } } } } }