fork download
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Text.RegularExpressions;
  6.  
  7. namespace RegexNegativePatternsForString
  8. {
  9. internal class Program
  10. {
  11. public static void Main()
  12. {
  13. //
  14. // 「文字列 ab を含まない」という正規表現は
  15. // ^([^a]|a+[^ab])*a*$
  16. // であってるのかテスト
  17. //
  18. string ng_word2 = "ab";
  19. Regex regex2 = new Regex(@"^([^a]|a+[^ab])*a*$");
  20. Test(regex2, ng_word2);
  21.  
  22. //
  23. // 「文字列 abc を含まない」という正規表現は
  24. // ^([^a]|a(a|ba)*([^ab]|b[^ac]))*(a(a|ba)*b?)?$
  25. // であってるのかテスト
  26. //
  27. string ng_word3 = "abc";
  28. Regex regex3 = new Regex(@"^([^a]|a(a|ba)*([^ab]|b[^ac]))*(a(a|ba)*b?)?$");
  29. Test(regex3, ng_word3);
  30. }
  31.  
  32. static void Test(Regex regex, string ng_word)
  33. {
  34. // aからz
  35. var a2z = Enumerable.Range(0, 26).Select(it => Convert.ToChar('a' + it));
  36.  
  37.  
  38. // 任意の2文字でテスト
  39. StringBuilder sb = new StringBuilder();
  40. foreach (var item in DP(a2z, a2z))
  41. {
  42. sb.Clear();
  43. sb.Append(item.Item1);
  44. sb.Append(item.Item2);
  45.  
  46. string input = sb.ToString();
  47. Test(input, regex, ng_word);
  48. }
  49.  
  50. // 任意の3文字でテスト
  51. foreach (var item in DP(a2z, a2z, a2z))
  52. {
  53. sb.Clear();
  54. sb.Append(item.Item1);
  55. sb.Append(item.Item2);
  56. sb.Append(item.Item3);
  57.  
  58. string input = sb.ToString();
  59. Test(input, regex, ng_word);
  60. }
  61.  
  62. // 任意の4文字でテスト
  63. foreach (var item in DP(a2z, a2z, a2z, a2z))
  64. {
  65. sb.Clear();
  66. sb.Append(item.Item1);
  67. sb.Append(item.Item2);
  68. sb.Append(item.Item3);
  69. sb.Append(item.Item4);
  70.  
  71. string input = sb.ToString();
  72. Test(input, regex, ng_word);
  73. }
  74.  
  75. // 任意の5文字でテスト
  76. foreach (var item in DP(a2z, a2z, a2z, a2z, a2z))
  77. {
  78. sb.Clear();
  79. sb.Append(item.Item1);
  80. sb.Append(item.Item2);
  81. sb.Append(item.Item3);
  82. sb.Append(item.Item4);
  83. sb.Append(item.Item5);
  84.  
  85. string input = sb.ToString();
  86. Test(input, regex, ng_word);
  87. }
  88.  
  89. Console.WriteLine("===== PASS! NG-word: {0} =====", ng_word);
  90. }
  91.  
  92. static void Test(string input, Regex regex, string ng)
  93. {
  94. bool actual = regex.IsMatch(input);
  95. bool expected = !input.Contains(ng);
  96. if (actual != expected)
  97. {
  98. string errMsg = string.Format("assertion failure! input: {0}, regex: {1}, NG-word: {2}", input, regex.ToString(), ng);
  99. throw new Exception(errMsg);
  100. }
  101. }
  102.  
  103. static IEnumerable<Tuple<T1, T2>> DP<T1, T2>(IEnumerable<T1> set1, IEnumerable<T2> set2)
  104. {
  105. foreach (var item1 in set1)
  106. {
  107. foreach (var item2 in set2)
  108. {
  109. yield return Tuple.Create(item1, item2);
  110. }
  111. }
  112. }
  113.  
  114. static IEnumerable<Tuple<T1, T2, T3>> DP<T1, T2, T3>(IEnumerable<T1> set1, IEnumerable<T2> set2, IEnumerable<T3> set3)
  115. {
  116. foreach (var item1 in set1)
  117. {
  118. foreach (var item2 in set2)
  119. {
  120. foreach (var item3 in set3)
  121. {
  122. yield return Tuple.Create(item1, item2, item3);
  123. }
  124. }
  125. }
  126. }
  127.  
  128. static IEnumerable<Tuple<T1, T2, T3, T4>> DP<T1, T2, T3, T4>(IEnumerable<T1> set1, IEnumerable<T2> set2, IEnumerable<T3> set3, IEnumerable<T4> set4)
  129. {
  130. foreach (var item1 in set1)
  131. {
  132. foreach (var item2 in set2)
  133. {
  134. foreach (var item3 in set3)
  135. {
  136. foreach (var item4 in set4)
  137. {
  138. yield return Tuple.Create(item1, item2, item3, item4);
  139. }
  140. }
  141. }
  142. }
  143. }
  144.  
  145. static IEnumerable<Tuple<T1, T2, T3, T4, T5>> DP<T1, T2, T3, T4, T5>(IEnumerable<T1> set1, IEnumerable<T2> set2, IEnumerable<T3> set3, IEnumerable<T4> set4, IEnumerable<T5> set5)
  146. {
  147. foreach (var item1 in set1)
  148. {
  149. foreach (var item2 in set2)
  150. {
  151. foreach (var item3 in set3)
  152. {
  153. foreach (var item4 in set4)
  154. {
  155. foreach (var item5 in set5)
  156. {
  157. yield return Tuple.Create(item1, item2, item3, item4, item5);
  158. }
  159. }
  160. }
  161. }
  162. }
  163. }
  164. }
  165. }
  166.  
Time limit exceeded #stdin #stdout 5s 33076KB
stdin
Standard input is empty
stdout
Standard output is empty