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