regextest.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. // Tencent is pleased to support the open source community by making RapidJSON available.
  2. //
  3. // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
  4. //
  5. // Licensed under the MIT License (the "License"); you may not use this file except
  6. // in compliance with the License. You may obtain a copy of the License at
  7. //
  8. // http://opensource.org/licenses/MIT
  9. //
  10. // Unless required by applicable law or agreed to in writing, software distributed
  11. // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
  12. // CONDITIONS OF ANY KIND, either express or implied. See the License for the
  13. // specific language governing permissions and limitations under the License.
  14. #include "unittest.h"
  15. #include "rapidjson/internal/regex.h"
  16. using namespace rapidjson::internal;
  17. TEST(Regex, Single) {
  18. Regex re("a");
  19. ASSERT_TRUE(re.IsValid());
  20. EXPECT_TRUE(re.Match("a"));
  21. EXPECT_FALSE(re.Match(""));
  22. EXPECT_FALSE(re.Match("b"));
  23. }
  24. TEST(Regex, Concatenation) {
  25. Regex re("abc");
  26. ASSERT_TRUE(re.IsValid());
  27. EXPECT_TRUE(re.Match("abc"));
  28. EXPECT_FALSE(re.Match(""));
  29. EXPECT_FALSE(re.Match("a"));
  30. EXPECT_FALSE(re.Match("b"));
  31. EXPECT_FALSE(re.Match("ab"));
  32. EXPECT_FALSE(re.Match("abcd"));
  33. }
  34. TEST(Regex, Alternation1) {
  35. Regex re("abab|abbb");
  36. ASSERT_TRUE(re.IsValid());
  37. EXPECT_TRUE(re.Match("abab"));
  38. EXPECT_TRUE(re.Match("abbb"));
  39. EXPECT_FALSE(re.Match(""));
  40. EXPECT_FALSE(re.Match("ab"));
  41. EXPECT_FALSE(re.Match("ababa"));
  42. EXPECT_FALSE(re.Match("abb"));
  43. EXPECT_FALSE(re.Match("abbbb"));
  44. }
  45. TEST(Regex, Alternation2) {
  46. Regex re("a|b|c");
  47. ASSERT_TRUE(re.IsValid());
  48. EXPECT_TRUE(re.Match("a"));
  49. EXPECT_TRUE(re.Match("b"));
  50. EXPECT_TRUE(re.Match("c"));
  51. EXPECT_FALSE(re.Match(""));
  52. EXPECT_FALSE(re.Match("aa"));
  53. EXPECT_FALSE(re.Match("ab"));
  54. }
  55. TEST(Regex, Parenthesis1) {
  56. Regex re("(ab)c");
  57. ASSERT_TRUE(re.IsValid());
  58. EXPECT_TRUE(re.Match("abc"));
  59. EXPECT_FALSE(re.Match(""));
  60. EXPECT_FALSE(re.Match("a"));
  61. EXPECT_FALSE(re.Match("b"));
  62. EXPECT_FALSE(re.Match("ab"));
  63. EXPECT_FALSE(re.Match("abcd"));
  64. }
  65. TEST(Regex, Parenthesis2) {
  66. Regex re("a(bc)");
  67. ASSERT_TRUE(re.IsValid());
  68. EXPECT_TRUE(re.Match("abc"));
  69. EXPECT_FALSE(re.Match(""));
  70. EXPECT_FALSE(re.Match("a"));
  71. EXPECT_FALSE(re.Match("b"));
  72. EXPECT_FALSE(re.Match("ab"));
  73. EXPECT_FALSE(re.Match("abcd"));
  74. }
  75. TEST(Regex, Parenthesis3) {
  76. Regex re("(a|b)(c|d)");
  77. ASSERT_TRUE(re.IsValid());
  78. EXPECT_TRUE(re.Match("ac"));
  79. EXPECT_TRUE(re.Match("ad"));
  80. EXPECT_TRUE(re.Match("bc"));
  81. EXPECT_TRUE(re.Match("bd"));
  82. EXPECT_FALSE(re.Match(""));
  83. EXPECT_FALSE(re.Match("ab"));
  84. EXPECT_FALSE(re.Match("cd"));
  85. }
  86. TEST(Regex, ZeroOrOne1) {
  87. Regex re("a?");
  88. ASSERT_TRUE(re.IsValid());
  89. EXPECT_TRUE(re.Match(""));
  90. EXPECT_TRUE(re.Match("a"));
  91. EXPECT_FALSE(re.Match("aa"));
  92. }
  93. TEST(Regex, ZeroOrOne2) {
  94. Regex re("a?b");
  95. ASSERT_TRUE(re.IsValid());
  96. EXPECT_TRUE(re.Match("b"));
  97. EXPECT_TRUE(re.Match("ab"));
  98. EXPECT_FALSE(re.Match("a"));
  99. EXPECT_FALSE(re.Match("aa"));
  100. EXPECT_FALSE(re.Match("bb"));
  101. EXPECT_FALSE(re.Match("ba"));
  102. }
  103. TEST(Regex, ZeroOrOne3) {
  104. Regex re("ab?");
  105. ASSERT_TRUE(re.IsValid());
  106. EXPECT_TRUE(re.Match("a"));
  107. EXPECT_TRUE(re.Match("ab"));
  108. EXPECT_FALSE(re.Match("b"));
  109. EXPECT_FALSE(re.Match("aa"));
  110. EXPECT_FALSE(re.Match("bb"));
  111. EXPECT_FALSE(re.Match("ba"));
  112. }
  113. TEST(Regex, ZeroOrOne4) {
  114. Regex re("a?b?");
  115. ASSERT_TRUE(re.IsValid());
  116. EXPECT_TRUE(re.Match(""));
  117. EXPECT_TRUE(re.Match("a"));
  118. EXPECT_TRUE(re.Match("b"));
  119. EXPECT_TRUE(re.Match("ab"));
  120. EXPECT_FALSE(re.Match("aa"));
  121. EXPECT_FALSE(re.Match("bb"));
  122. EXPECT_FALSE(re.Match("ba"));
  123. EXPECT_FALSE(re.Match("abc"));
  124. }
  125. TEST(Regex, ZeroOrOne5) {
  126. Regex re("a(ab)?b");
  127. ASSERT_TRUE(re.IsValid());
  128. EXPECT_TRUE(re.Match("ab"));
  129. EXPECT_TRUE(re.Match("aabb"));
  130. EXPECT_FALSE(re.Match("aab"));
  131. EXPECT_FALSE(re.Match("abb"));
  132. }
  133. TEST(Regex, ZeroOrMore1) {
  134. Regex re("a*");
  135. ASSERT_TRUE(re.IsValid());
  136. EXPECT_TRUE(re.Match(""));
  137. EXPECT_TRUE(re.Match("a"));
  138. EXPECT_TRUE(re.Match("aa"));
  139. EXPECT_FALSE(re.Match("b"));
  140. EXPECT_FALSE(re.Match("ab"));
  141. }
  142. TEST(Regex, ZeroOrMore2) {
  143. Regex re("a*b");
  144. ASSERT_TRUE(re.IsValid());
  145. EXPECT_TRUE(re.Match("b"));
  146. EXPECT_TRUE(re.Match("ab"));
  147. EXPECT_TRUE(re.Match("aab"));
  148. EXPECT_FALSE(re.Match(""));
  149. EXPECT_FALSE(re.Match("bb"));
  150. }
  151. TEST(Regex, ZeroOrMore3) {
  152. Regex re("a*b*");
  153. ASSERT_TRUE(re.IsValid());
  154. EXPECT_TRUE(re.Match(""));
  155. EXPECT_TRUE(re.Match("a"));
  156. EXPECT_TRUE(re.Match("aa"));
  157. EXPECT_TRUE(re.Match("b"));
  158. EXPECT_TRUE(re.Match("bb"));
  159. EXPECT_TRUE(re.Match("ab"));
  160. EXPECT_TRUE(re.Match("aabb"));
  161. EXPECT_FALSE(re.Match("ba"));
  162. }
  163. TEST(Regex, ZeroOrMore4) {
  164. Regex re("a(ab)*b");
  165. ASSERT_TRUE(re.IsValid());
  166. EXPECT_TRUE(re.Match("ab"));
  167. EXPECT_TRUE(re.Match("aabb"));
  168. EXPECT_TRUE(re.Match("aababb"));
  169. EXPECT_FALSE(re.Match(""));
  170. EXPECT_FALSE(re.Match("aa"));
  171. }
  172. TEST(Regex, OneOrMore1) {
  173. Regex re("a+");
  174. ASSERT_TRUE(re.IsValid());
  175. EXPECT_TRUE(re.Match("a"));
  176. EXPECT_TRUE(re.Match("aa"));
  177. EXPECT_FALSE(re.Match(""));
  178. EXPECT_FALSE(re.Match("b"));
  179. EXPECT_FALSE(re.Match("ab"));
  180. }
  181. TEST(Regex, OneOrMore2) {
  182. Regex re("a+b");
  183. ASSERT_TRUE(re.IsValid());
  184. EXPECT_TRUE(re.Match("ab"));
  185. EXPECT_TRUE(re.Match("aab"));
  186. EXPECT_FALSE(re.Match(""));
  187. EXPECT_FALSE(re.Match("b"));
  188. }
  189. TEST(Regex, OneOrMore3) {
  190. Regex re("a+b+");
  191. ASSERT_TRUE(re.IsValid());
  192. EXPECT_TRUE(re.Match("ab"));
  193. EXPECT_TRUE(re.Match("aab"));
  194. EXPECT_TRUE(re.Match("abb"));
  195. EXPECT_TRUE(re.Match("aabb"));
  196. EXPECT_FALSE(re.Match(""));
  197. EXPECT_FALSE(re.Match("b"));
  198. EXPECT_FALSE(re.Match("ba"));
  199. }
  200. TEST(Regex, OneOrMore4) {
  201. Regex re("a(ab)+b");
  202. ASSERT_TRUE(re.IsValid());
  203. EXPECT_TRUE(re.Match("aabb"));
  204. EXPECT_TRUE(re.Match("aababb"));
  205. EXPECT_FALSE(re.Match(""));
  206. EXPECT_FALSE(re.Match("ab"));
  207. }
  208. TEST(Regex, QuantifierExact1) {
  209. Regex re("ab{3}c");
  210. ASSERT_TRUE(re.IsValid());
  211. EXPECT_TRUE(re.Match("abbbc"));
  212. EXPECT_FALSE(re.Match("ac"));
  213. EXPECT_FALSE(re.Match("abc"));
  214. EXPECT_FALSE(re.Match("abbc"));
  215. EXPECT_FALSE(re.Match("abbbbc"));
  216. }
  217. TEST(Regex, QuantifierExact2) {
  218. Regex re("a(bc){3}d");
  219. ASSERT_TRUE(re.IsValid());
  220. EXPECT_TRUE(re.Match("abcbcbcd"));
  221. EXPECT_FALSE(re.Match("ad"));
  222. EXPECT_FALSE(re.Match("abcd"));
  223. EXPECT_FALSE(re.Match("abcbcd"));
  224. EXPECT_FALSE(re.Match("abcbcbcbcd"));
  225. }
  226. TEST(Regex, QuantifierExact3) {
  227. Regex re("a(b|c){3}d");
  228. ASSERT_TRUE(re.IsValid());
  229. EXPECT_TRUE(re.Match("abbbd"));
  230. EXPECT_TRUE(re.Match("acccd"));
  231. EXPECT_TRUE(re.Match("abcbd"));
  232. EXPECT_FALSE(re.Match("ad"));
  233. EXPECT_FALSE(re.Match("abbd"));
  234. EXPECT_FALSE(re.Match("accccd"));
  235. EXPECT_FALSE(re.Match("abbbbd"));
  236. }
  237. TEST(Regex, QuantifierMin1) {
  238. Regex re("ab{3,}c");
  239. ASSERT_TRUE(re.IsValid());
  240. EXPECT_TRUE(re.Match("abbbc"));
  241. EXPECT_TRUE(re.Match("abbbbc"));
  242. EXPECT_TRUE(re.Match("abbbbbc"));
  243. EXPECT_FALSE(re.Match("ac"));
  244. EXPECT_FALSE(re.Match("abc"));
  245. EXPECT_FALSE(re.Match("abbc"));
  246. }
  247. TEST(Regex, QuantifierMin2) {
  248. Regex re("a(bc){3,}d");
  249. ASSERT_TRUE(re.IsValid());
  250. EXPECT_TRUE(re.Match("abcbcbcd"));
  251. EXPECT_TRUE(re.Match("abcbcbcbcd"));
  252. EXPECT_FALSE(re.Match("ad"));
  253. EXPECT_FALSE(re.Match("abcd"));
  254. EXPECT_FALSE(re.Match("abcbcd"));
  255. }
  256. TEST(Regex, QuantifierMin3) {
  257. Regex re("a(b|c){3,}d");
  258. ASSERT_TRUE(re.IsValid());
  259. EXPECT_TRUE(re.Match("abbbd"));
  260. EXPECT_TRUE(re.Match("acccd"));
  261. EXPECT_TRUE(re.Match("abcbd"));
  262. EXPECT_TRUE(re.Match("accccd"));
  263. EXPECT_TRUE(re.Match("abbbbd"));
  264. EXPECT_FALSE(re.Match("ad"));
  265. EXPECT_FALSE(re.Match("abbd"));
  266. }
  267. TEST(Regex, QuantifierMinMax1) {
  268. Regex re("ab{3,5}c");
  269. ASSERT_TRUE(re.IsValid());
  270. EXPECT_TRUE(re.Match("abbbc"));
  271. EXPECT_TRUE(re.Match("abbbbc"));
  272. EXPECT_TRUE(re.Match("abbbbbc"));
  273. EXPECT_FALSE(re.Match("ac"));
  274. EXPECT_FALSE(re.Match("abc"));
  275. EXPECT_FALSE(re.Match("abbc"));
  276. EXPECT_FALSE(re.Match("abbbbbbc"));
  277. }
  278. TEST(Regex, QuantifierMinMax2) {
  279. Regex re("a(bc){3,5}d");
  280. ASSERT_TRUE(re.IsValid());
  281. EXPECT_TRUE(re.Match("abcbcbcd"));
  282. EXPECT_TRUE(re.Match("abcbcbcbcd"));
  283. EXPECT_TRUE(re.Match("abcbcbcbcbcd"));
  284. EXPECT_FALSE(re.Match("ad"));
  285. EXPECT_FALSE(re.Match("abcd"));
  286. EXPECT_FALSE(re.Match("abcbcd"));
  287. EXPECT_FALSE(re.Match("abcbcbcbcbcbcd"));
  288. }
  289. TEST(Regex, QuantifierMinMax3) {
  290. Regex re("a(b|c){3,5}d");
  291. ASSERT_TRUE(re.IsValid());
  292. EXPECT_TRUE(re.Match("abbbd"));
  293. EXPECT_TRUE(re.Match("acccd"));
  294. EXPECT_TRUE(re.Match("abcbd"));
  295. EXPECT_TRUE(re.Match("accccd"));
  296. EXPECT_TRUE(re.Match("abbbbd"));
  297. EXPECT_TRUE(re.Match("acccccd"));
  298. EXPECT_TRUE(re.Match("abbbbbd"));
  299. EXPECT_FALSE(re.Match("ad"));
  300. EXPECT_FALSE(re.Match("abbd"));
  301. EXPECT_FALSE(re.Match("accccccd"));
  302. EXPECT_FALSE(re.Match("abbbbbbd"));
  303. }
  304. // Issue538
  305. TEST(Regex, QuantifierMinMax4) {
  306. Regex re("a(b|c){0,3}d");
  307. ASSERT_TRUE(re.IsValid());
  308. EXPECT_TRUE(re.Match("ad"));
  309. EXPECT_TRUE(re.Match("abd"));
  310. EXPECT_TRUE(re.Match("acd"));
  311. EXPECT_TRUE(re.Match("abbd"));
  312. EXPECT_TRUE(re.Match("accd"));
  313. EXPECT_TRUE(re.Match("abcd"));
  314. EXPECT_TRUE(re.Match("abbbd"));
  315. EXPECT_TRUE(re.Match("acccd"));
  316. EXPECT_FALSE(re.Match("abbbbd"));
  317. EXPECT_FALSE(re.Match("add"));
  318. EXPECT_FALSE(re.Match("accccd"));
  319. EXPECT_FALSE(re.Match("abcbcd"));
  320. }
  321. // Issue538
  322. TEST(Regex, QuantifierMinMax5) {
  323. Regex re("a(b|c){0,}d");
  324. ASSERT_TRUE(re.IsValid());
  325. EXPECT_TRUE(re.Match("ad"));
  326. EXPECT_TRUE(re.Match("abd"));
  327. EXPECT_TRUE(re.Match("acd"));
  328. EXPECT_TRUE(re.Match("abbd"));
  329. EXPECT_TRUE(re.Match("accd"));
  330. EXPECT_TRUE(re.Match("abcd"));
  331. EXPECT_TRUE(re.Match("abbbd"));
  332. EXPECT_TRUE(re.Match("acccd"));
  333. EXPECT_TRUE(re.Match("abbbbd"));
  334. EXPECT_TRUE(re.Match("accccd"));
  335. EXPECT_TRUE(re.Match("abcbcd"));
  336. EXPECT_FALSE(re.Match("add"));
  337. EXPECT_FALSE(re.Match("aad"));
  338. }
  339. #define EURO "\xE2\x82\xAC" // "\xE2\x82\xAC" is UTF-8 sequence of Euro sign U+20AC
  340. TEST(Regex, Unicode) {
  341. Regex re("a" EURO "+b");
  342. ASSERT_TRUE(re.IsValid());
  343. EXPECT_TRUE(re.Match("a" EURO "b"));
  344. EXPECT_TRUE(re.Match("a" EURO EURO "b"));
  345. EXPECT_FALSE(re.Match("a?b"));
  346. EXPECT_FALSE(re.Match("a" EURO "\xAC" "b")); // unaware of UTF-8 will match
  347. }
  348. TEST(Regex, AnyCharacter) {
  349. Regex re(".");
  350. ASSERT_TRUE(re.IsValid());
  351. EXPECT_TRUE(re.Match("a"));
  352. EXPECT_TRUE(re.Match("b"));
  353. EXPECT_TRUE(re.Match(EURO));
  354. EXPECT_FALSE(re.Match(""));
  355. EXPECT_FALSE(re.Match("aa"));
  356. }
  357. TEST(Regex, CharacterRange1) {
  358. Regex re("[abc]");
  359. ASSERT_TRUE(re.IsValid());
  360. EXPECT_TRUE(re.Match("a"));
  361. EXPECT_TRUE(re.Match("b"));
  362. EXPECT_TRUE(re.Match("c"));
  363. EXPECT_FALSE(re.Match(""));
  364. EXPECT_FALSE(re.Match("`"));
  365. EXPECT_FALSE(re.Match("d"));
  366. EXPECT_FALSE(re.Match("aa"));
  367. }
  368. TEST(Regex, CharacterRange2) {
  369. Regex re("[^abc]");
  370. ASSERT_TRUE(re.IsValid());
  371. EXPECT_TRUE(re.Match("`"));
  372. EXPECT_TRUE(re.Match("d"));
  373. EXPECT_FALSE(re.Match("a"));
  374. EXPECT_FALSE(re.Match("b"));
  375. EXPECT_FALSE(re.Match("c"));
  376. EXPECT_FALSE(re.Match(""));
  377. EXPECT_FALSE(re.Match("aa"));
  378. }
  379. TEST(Regex, CharacterRange3) {
  380. Regex re("[a-c]");
  381. ASSERT_TRUE(re.IsValid());
  382. EXPECT_TRUE(re.Match("a"));
  383. EXPECT_TRUE(re.Match("b"));
  384. EXPECT_TRUE(re.Match("c"));
  385. EXPECT_FALSE(re.Match(""));
  386. EXPECT_FALSE(re.Match("`"));
  387. EXPECT_FALSE(re.Match("d"));
  388. EXPECT_FALSE(re.Match("aa"));
  389. }
  390. TEST(Regex, CharacterRange4) {
  391. Regex re("[^a-c]");
  392. ASSERT_TRUE(re.IsValid());
  393. EXPECT_TRUE(re.Match("`"));
  394. EXPECT_TRUE(re.Match("d"));
  395. EXPECT_FALSE(re.Match("a"));
  396. EXPECT_FALSE(re.Match("b"));
  397. EXPECT_FALSE(re.Match("c"));
  398. EXPECT_FALSE(re.Match(""));
  399. EXPECT_FALSE(re.Match("aa"));
  400. }
  401. TEST(Regex, CharacterRange5) {
  402. Regex re("[-]");
  403. ASSERT_TRUE(re.IsValid());
  404. EXPECT_TRUE(re.Match("-"));
  405. EXPECT_FALSE(re.Match(""));
  406. EXPECT_FALSE(re.Match("a"));
  407. }
  408. TEST(Regex, CharacterRange6) {
  409. Regex re("[a-]");
  410. ASSERT_TRUE(re.IsValid());
  411. EXPECT_TRUE(re.Match("a"));
  412. EXPECT_TRUE(re.Match("-"));
  413. EXPECT_FALSE(re.Match(""));
  414. EXPECT_FALSE(re.Match("`"));
  415. EXPECT_FALSE(re.Match("b"));
  416. }
  417. TEST(Regex, CharacterRange7) {
  418. Regex re("[-a]");
  419. ASSERT_TRUE(re.IsValid());
  420. EXPECT_TRUE(re.Match("a"));
  421. EXPECT_TRUE(re.Match("-"));
  422. EXPECT_FALSE(re.Match(""));
  423. EXPECT_FALSE(re.Match("`"));
  424. EXPECT_FALSE(re.Match("b"));
  425. }
  426. TEST(Regex, CharacterRange8) {
  427. Regex re("[a-zA-Z0-9]*");
  428. ASSERT_TRUE(re.IsValid());
  429. EXPECT_TRUE(re.Match("Milo"));
  430. EXPECT_TRUE(re.Match("MT19937"));
  431. EXPECT_TRUE(re.Match("43"));
  432. EXPECT_FALSE(re.Match("a_b"));
  433. EXPECT_FALSE(re.Match("!"));
  434. }
  435. TEST(Regex, Search) {
  436. Regex re("abc");
  437. ASSERT_TRUE(re.IsValid());
  438. EXPECT_TRUE(re.Search("abc"));
  439. EXPECT_TRUE(re.Search("_abc"));
  440. EXPECT_TRUE(re.Search("abc_"));
  441. EXPECT_TRUE(re.Search("_abc_"));
  442. EXPECT_TRUE(re.Search("__abc__"));
  443. EXPECT_TRUE(re.Search("abcabc"));
  444. EXPECT_FALSE(re.Search("a"));
  445. EXPECT_FALSE(re.Search("ab"));
  446. EXPECT_FALSE(re.Search("bc"));
  447. EXPECT_FALSE(re.Search("cba"));
  448. }
  449. TEST(Regex, Search_BeginAnchor) {
  450. Regex re("^abc");
  451. ASSERT_TRUE(re.IsValid());
  452. EXPECT_TRUE(re.Search("abc"));
  453. EXPECT_TRUE(re.Search("abc_"));
  454. EXPECT_TRUE(re.Search("abcabc"));
  455. EXPECT_FALSE(re.Search("_abc"));
  456. EXPECT_FALSE(re.Search("_abc_"));
  457. EXPECT_FALSE(re.Search("a"));
  458. EXPECT_FALSE(re.Search("ab"));
  459. EXPECT_FALSE(re.Search("bc"));
  460. EXPECT_FALSE(re.Search("cba"));
  461. }
  462. TEST(Regex, Search_EndAnchor) {
  463. Regex re("abc$");
  464. ASSERT_TRUE(re.IsValid());
  465. EXPECT_TRUE(re.Search("abc"));
  466. EXPECT_TRUE(re.Search("_abc"));
  467. EXPECT_TRUE(re.Search("abcabc"));
  468. EXPECT_FALSE(re.Search("abc_"));
  469. EXPECT_FALSE(re.Search("_abc_"));
  470. EXPECT_FALSE(re.Search("a"));
  471. EXPECT_FALSE(re.Search("ab"));
  472. EXPECT_FALSE(re.Search("bc"));
  473. EXPECT_FALSE(re.Search("cba"));
  474. }
  475. TEST(Regex, Search_BothAnchor) {
  476. Regex re("^abc$");
  477. ASSERT_TRUE(re.IsValid());
  478. EXPECT_TRUE(re.Search("abc"));
  479. EXPECT_FALSE(re.Search(""));
  480. EXPECT_FALSE(re.Search("a"));
  481. EXPECT_FALSE(re.Search("b"));
  482. EXPECT_FALSE(re.Search("ab"));
  483. EXPECT_FALSE(re.Search("abcd"));
  484. }
  485. TEST(Regex, Escape) {
  486. const char* s = "\\^\\$\\|\\(\\)\\?\\*\\+\\.\\[\\]\\{\\}\\\\\\f\\n\\r\\t\\v[\\b][\\[][\\]]";
  487. Regex re(s);
  488. ASSERT_TRUE(re.IsValid());
  489. EXPECT_TRUE(re.Match("^$|()?*+.[]{}\\\x0C\n\r\t\x0B\b[]"));
  490. EXPECT_FALSE(re.Match(s)); // Not escaping
  491. }
  492. TEST(Regex, Invalid) {
  493. #define TEST_INVALID(s) \
  494. {\
  495. Regex re(s);\
  496. EXPECT_FALSE(re.IsValid());\
  497. }
  498. TEST_INVALID("");
  499. TEST_INVALID("a|");
  500. TEST_INVALID("()");
  501. TEST_INVALID(")");
  502. TEST_INVALID("(a))");
  503. TEST_INVALID("(a|)");
  504. TEST_INVALID("(a||b)");
  505. TEST_INVALID("(|b)");
  506. TEST_INVALID("?");
  507. TEST_INVALID("*");
  508. TEST_INVALID("+");
  509. TEST_INVALID("{");
  510. TEST_INVALID("{}");
  511. TEST_INVALID("a{a}");
  512. TEST_INVALID("a{0}");
  513. TEST_INVALID("a{-1}");
  514. TEST_INVALID("a{}");
  515. // TEST_INVALID("a{0,}"); // Support now
  516. TEST_INVALID("a{,0}");
  517. TEST_INVALID("a{1,0}");
  518. TEST_INVALID("a{-1,0}");
  519. TEST_INVALID("a{-1,1}");
  520. TEST_INVALID("a{4294967296}"); // overflow of unsigned
  521. TEST_INVALID("a{1a}");
  522. TEST_INVALID("[");
  523. TEST_INVALID("[]");
  524. TEST_INVALID("[^]");
  525. TEST_INVALID("[\\a]");
  526. TEST_INVALID("\\a");
  527. #undef TEST_INVALID
  528. }
  529. TEST(Regex, Issue538) {
  530. Regex re("^[0-9]+(\\\\.[0-9]+){0,2}");
  531. EXPECT_TRUE(re.IsValid());
  532. }
  533. TEST(Regex, Issue583) {
  534. Regex re("[0-9]{99999}");
  535. ASSERT_TRUE(re.IsValid());
  536. }
  537. #undef EURO