RegexBugs.cs 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. //
  2. // MonoTests.System.Text.RegularExpressions misc. test cases
  3. //
  4. // Authors:
  5. // Gonzalo Paniagua Javier ([email protected])
  6. //
  7. // (c) Copyright 2003,2004 Novell, Inc. (http://www.novell.com)
  8. //
  9. using NUnit.Framework;
  10. using System;
  11. using System.Text.RegularExpressions;
  12. namespace MonoTests.System.Text.RegularExpressions
  13. {
  14. [TestFixture]
  15. public class RegexBugs : Assertion
  16. {
  17. [Test]
  18. public void SplitGroup () // bug51146
  19. {
  20. string [] splitResult = new Regex ("-").Split ("a-bcd-e-fg");
  21. string [] expected = new string [] {"a", "bcd", "e", "fg"};
  22. int length = expected.Length;
  23. int i;
  24. AssertEquals ("#01", length, splitResult.Length);
  25. for (i = 0; i < length; i++)
  26. AssertEquals ("#02 " + i, expected [i], splitResult [i]);
  27. splitResult = new Regex ("(-)").Split ("a-bcd-e-fg");
  28. expected = new string [] {"a", "-", "bcd", "-", "e", "-", "fg"};
  29. length = expected.Length;
  30. AssertEquals ("#03", length, splitResult.Length);
  31. for (i = 0; i < length; i++)
  32. AssertEquals ("#04 " + i, expected [i], splitResult [i]);
  33. splitResult = new Regex ("(-)b(c)").Split ("a-bcd-e-fg");
  34. expected = new string [] {"a", "-", "c", "d-e-fg" };
  35. length = expected.Length;
  36. AssertEquals ("#04", length, splitResult.Length);
  37. for (i = 0; i < length; i++)
  38. AssertEquals ("#05 " + i, expected [i], splitResult [i]);
  39. splitResult = new Regex ("-").Split ("a-bcd-e-fg-");
  40. expected = new string [] {"a", "bcd", "e", "fg", ""};
  41. length = expected.Length;
  42. AssertEquals ("#06", length, splitResult.Length);
  43. for (i = 0; i < length; i++)
  44. AssertEquals ("#07 " + i, expected [i], splitResult [i]);
  45. }
  46. [Test]
  47. public void MathEmptyGroup () // bug 42529
  48. {
  49. string str = "Match something from here.";
  50. AssertEquals ("MEG #01", false, Regex.IsMatch(str, @"(something|dog)$"));
  51. AssertEquals ("MEG #02", true, Regex.IsMatch(str, @"(|something|dog)$"));
  52. AssertEquals ("MEG #03", true, Regex.IsMatch(str, @"(something||dog)$"));
  53. AssertEquals ("MEG #04", true, Regex.IsMatch(str, @"(something|dog|)$"));
  54. AssertEquals ("MEG #05", true, Regex.IsMatch(str, @"(something|dog)*"));
  55. AssertEquals ("MEG #06", true, Regex.IsMatch(str, @"(|something|dog)*"));
  56. AssertEquals ("MEG #07", true, Regex.IsMatch(str, @"(something||dog)*"));
  57. AssertEquals ("MEG #08", true, Regex.IsMatch(str, @"(something|dog|)*"));
  58. AssertEquals ("MEG #09", true, Regex.IsMatch(str, @"(something|dog)*$"));
  59. AssertEquals ("MEG #10", true, Regex.IsMatch(str, @"(|something|dog)*$"));
  60. AssertEquals ("MEG #11", true, Regex.IsMatch(str, @"(something||dog)*$"));
  61. AssertEquals ("MEG #12", true, Regex.IsMatch(str, @"(something|dog|)*$"));
  62. }
  63. [Test]
  64. public void Braces () // bug 52924
  65. {
  66. // Before the fix, the next line throws an exception
  67. Regex regVar = new Regex(@"{\w+}");
  68. Match m = regVar.Match ("{ }");
  69. AssertEquals ("BR #01", false, m.Success);
  70. }
  71. [Test]
  72. public void RangeIgnoreCase() // bug 45976
  73. {
  74. string str = "AAABBBBAAA" ;
  75. AssertEquals("RIC #01", true, Regex.IsMatch(str, @"[A-F]+", RegexOptions.IgnoreCase));
  76. AssertEquals("RIC #02", true, Regex.IsMatch(str, @"[a-f]+", RegexOptions.IgnoreCase));
  77. AssertEquals("RIC #03", true, Regex.IsMatch(str, @"[A-Fa-f]+", RegexOptions.IgnoreCase));
  78. AssertEquals("RIC #04", true, Regex.IsMatch(str, @"[AB]+", RegexOptions.IgnoreCase));
  79. AssertEquals("RIC #05", true, Regex.IsMatch(str, @"[A-B]+", RegexOptions.IgnoreCase));
  80. str = "AaaBBBaAa" ;
  81. AssertEquals("RIC #06", true, Regex.IsMatch(str, @"[A-F]+", RegexOptions.IgnoreCase));
  82. AssertEquals("RIC #07", true, Regex.IsMatch(str, @"[a-f]+", RegexOptions.IgnoreCase));
  83. AssertEquals("RIC #08", true, Regex.IsMatch(str, @"[A-Fa-f]+", RegexOptions.IgnoreCase));
  84. AssertEquals("RIC #09", true, Regex.IsMatch(str, @"[AB]+", RegexOptions.IgnoreCase));
  85. AssertEquals("RIC #10", true, Regex.IsMatch(str, @"[A-B]+", RegexOptions.IgnoreCase));
  86. str = "Aaa[";
  87. AssertEquals("RIC #11", true, Regex.IsMatch(str, @"[A-a]+", RegexOptions.IgnoreCase));
  88. str = "Ae";
  89. Assert("RIC #12", Regex.IsMatch(str, @"[A-a]+", RegexOptions.IgnoreCase));
  90. }
  91. [Test]
  92. public void Escape0 () // bug54797
  93. {
  94. Regex r = new Regex(@"^[\s\0]*$");
  95. AssertEquals ("E0-1", true, r.Match(" \0").Success);
  96. }
  97. [Test()]
  98. public void MultipleMatches()
  99. {
  100. Regex regex = new Regex (@"^(?'path'.*(\\|/)|(/|\\))(?'file'.*)$");
  101. Match match = regex.Match (@"d:\Temp\SomeDir\SomeDir\bla.xml");
  102. AssertEquals ("MM #01", 5, match.Groups.Count);
  103. AssertEquals ("MM #02", "1", regex.GroupNameFromNumber(1));
  104. AssertEquals ("MM #03", "2", regex.GroupNameFromNumber(2));
  105. AssertEquals ("MM #04", "path", regex.GroupNameFromNumber(3));
  106. AssertEquals ("MM #05", "file", regex.GroupNameFromNumber(4));
  107. AssertEquals ("MM #06", "\\", match.Groups[1].Value);
  108. AssertEquals ("MM #07", "", match.Groups[2].Value);
  109. AssertEquals ("MM #08", @"d:\Temp\SomeDir\SomeDir\", match.Groups[3].Value);
  110. AssertEquals ("MM #09", "bla.xml", match.Groups[4].Value);
  111. }
  112. [Test]
  113. public void SameNameGroups () // First problem in fixing bug #56000
  114. {
  115. string rex = "link\\s*rel\\s*=\\s*[\"']?alternate[\"']?\\s*";
  116. rex += "type\\s*=\\s*[\"']?text/xml[\"']?\\s*href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|'(?<1>[^']*)'|(?<1>\\S+))";
  117. Regex rob = new Regex (rex, RegexOptions.IgnoreCase);
  118. }
  119. [Test]
  120. public void UndefinedGroup () // bug 52890
  121. {
  122. Regex regex = new Regex( "[A-Za-z_0-9]" );
  123. Match m = regex.Match( "123456789abc" );
  124. Group g = m.Groups["not_defined"];
  125. AssertNotNull ("#0", g);
  126. AssertEquals ("#1", 0, g.Index);
  127. AssertEquals ("#2", 0, g.Length);
  128. AssertEquals ("#3", "", g.Value);
  129. Assert ("#4", !g.Success);
  130. AssertNotNull ("#5", g.Captures);
  131. AssertEquals ("#6", 0, g.Captures.Count);
  132. }
  133. [Test]
  134. public void Quantifiers1 ()
  135. {
  136. Regex re = new Regex ("[\\w\\W]{8,32}");
  137. Match m = re.Match (new string ('1', 7));
  138. AssertEquals ("#01", false, m.Success);
  139. }
  140. [Test]
  141. public void Quantifiers2 ()
  142. {
  143. Regex re = new Regex ("[\\w\\W]{8,32}");
  144. Match m = re.Match (new string ('1', 8));
  145. AssertEquals ("#01", true, m.Success);
  146. }
  147. [Test]
  148. public void Quantifiers3 ()
  149. {
  150. Regex re = new Regex ("[\\w\\W]{8,32}");
  151. Match m = re.Match (new string ('1', 16));
  152. AssertEquals ("#01", true, m.Success);
  153. }
  154. [Test]
  155. public void Quantifiers4 ()
  156. {
  157. Regex re = new Regex ("[\\w\\W]{8,32}");
  158. Match m = re.Match (new string ('1', 32));
  159. AssertEquals ("#01", true, m.Success);
  160. }
  161. [Test]
  162. public void Quantifiers5 ()
  163. {
  164. Regex re = new Regex ("[\\w\\W]{8,32}");
  165. Match m = re.Match (new string ('1', 33));
  166. AssertEquals ("#01", true, m.Success);
  167. }
  168. [Test]
  169. public void CategoryAndNegated () // Was a regression after first attemp to fix 59150.
  170. {
  171. string text = "<?xml version=\"1.0\"?>";
  172. Regex re = new Regex ("<\\s*(\\/?)\\s*([\\s\\S]*?)\\s*(\\/?)\\s*>");
  173. text = re.Replace (text, "{blue:&lt;$1}{maroon:$2}{blue:$3&gt;}");
  174. AssertEquals ("#01", "{blue:&lt;}{maroon:?xml version=\"1.0\"?}{blue:&gt;}", text);
  175. }
  176. [Test]
  177. public void BackSpace ()
  178. {
  179. string text = "Go, \bNo\bGo" ;
  180. Regex re = new Regex(@"\b[\b]");
  181. text = re.Replace(text, " ");
  182. AssertEquals("#01", "Go, \bNo Go", text);
  183. }
  184. }
  185. }