regextest.cpp 15 KB

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