11.1.6 (2019-04-16) 2================== 3This release fixes a regression introduced by a bug fix (for 4[BUG #557](https://github.com/rust-lang/regex/issues/557)) which could cause 5the regex engine to enter an infinite loop. This bug was originally 6[reported against ripgrep](https://github.com/BurntSushi/ripgrep/issues/1247). 7 8 91.1.5 (2019-04-01) 10================== 11This release fixes a bug in regex's dependency specification where it requires 12a newer version of regex-syntax, but this wasn't communicated correctly in the 13Cargo.toml. This would have been caught by a minimal version check, but this 14check was disabled because the `rand` crate itself advertises incorrect 15dependency specifications. 16 17Bug fixes: 18 19* [BUG #570](https://github.com/rust-lang/regex/pull/570): 20 Fix regex-syntax minimal version. 21 22 231.1.4 (2019-03-31) 24================== 25This release fixes a backwards compatibility regression where Regex was no 26longer UnwindSafe. This was caused by the upgrade to aho-corasick 0.7, whose 27AhoCorasick type was itself not UnwindSafe. This has been fixed in aho-corasick 280.7.4, which we now require. 29 30Bug fixes: 31 32* [BUG #568](https://github.com/rust-lang/regex/pull/568): 33 Fix an API regression where Regex was no longer UnwindSafe. 34 35 361.1.3 (2019-03-30) 37================== 38This releases fixes a few bugs and adds a performance improvement when a regex 39is a simple alternation of literals. 40 41Performance improvements: 42 43* [OPT #566](https://github.com/rust-lang/regex/pull/566): 44 Upgrades `aho-corasick` to 0.7 and uses it for `foo|bar|...|quux` regexes. 45 46Bug fixes: 47 48* [BUG #527](https://github.com/rust-lang/regex/issues/527): 49 Fix a bug where the parser would panic on patterns like `((?x))`. 50* [BUG #555](https://github.com/rust-lang/regex/issues/555): 51 Fix a bug where the parser would panic on patterns like `(?m){1,1}`. 52* [BUG #557](https://github.com/rust-lang/regex/issues/557): 53 Fix a bug where captures could lead to an incorrect match. 54 55 561.1.2 (2019-02-27) 57================== 58This release fixes a bug found in the fix introduced in 1.1.1. 59 60Bug fixes: 61 62* [BUG edf45e6f](https://github.com/rust-lang/regex/commit/edf45e6f): 63 Fix bug introduced in reverse suffix literal matcher in the 1.1.1 release. 64 65 661.1.1 (2019-02-27) 67================== 68This is a small release with one fix for a bug caused by literal optimizations. 69 70Bug fixes: 71 72* [BUG 661bf53d](https://github.com/rust-lang/regex/commit/661bf53d): 73 Fixes a bug in the reverse suffix literal optimization. This was originally 74 reported 75 [against ripgrep](https://github.com/BurntSushi/ripgrep/issues/1203). 76 77 781.1.0 (2018-11-30) 79================== 80This is a small release with a couple small enhancements. This release also 81increases the minimal supported Rust version (MSRV) to 1.24.1 (from 1.20.0). In 82accordance with this crate's MSRV policy, this release bumps the minor version 83number. 84 85Performance improvements: 86 87* [OPT #511](https://github.com/rust-lang/regex/pull/511), 88 [OPT #540](https://github.com/rust-lang/regex/pull/540): 89 Improve lazy DFA construction for large regex sets. 90 91New features: 92 93* [FEATURE #538](https://github.com/rust-lang/regex/pull/538): 94 Add Emoji and "break" Unicode properties. See [UNICODE.md](UNICODE.md). 95 96Bug fixes: 97 98* [BUG #530](https://github.com/rust-lang/regex/pull/530): 99 Add Unicode license (for data tables). 100* Various typo/doc fixups. 101 102 1031.0.6 (2018-11-06) 104================== 105This is a small release. 106 107Performance improvements: 108 109* [OPT #513](https://github.com/rust-lang/regex/pull/513): 110 Improve performance of compiling large Unicode classes by 8-10%. 111 112Bug fixes: 113 114* [BUG #533](https://github.com/rust-lang/regex/issues/533): 115 Fix definition of `[[:blank:]]` class that regressed in `regex-syntax 0.5`. 116 117 1181.0.5 (2018-09-06) 119================== 120This is a small release with an API enhancement. 121 122New features: 123 124* [FEATURE #509](https://github.com/rust-lang/regex/pull/509): 125 Generalize impls of the `Replacer` trait. 126 127 1281.0.4 (2018-08-25) 129================== 130This is a small release that bumps the quickcheck dependency. 131 132 1331.0.3 (2018-08-24) 134================== 135This is a small bug fix release. 136 137Bug fixes: 138 139* [BUG #504](https://github.com/rust-lang/regex/pull/504): 140 Fix for Cargo's "minimal version" support. 141* [BUG 1e39165f](https://github.com/rust-lang/regex/commit/1e39165f): 142 Fix doc examples for byte regexes. 143 144 1451.0.2 (2018-07-18) 146================== 147This release exposes some new lower level APIs on `Regex` that permit 148amortizing allocation and controlling the location at which a search is 149performed in a more granular way. Most users of the regex crate will not 150need or want to use these APIs. 151 152New features: 153 154* [FEATURE #493](https://github.com/rust-lang/regex/pull/493): 155 Add a few lower level APIs for amortizing allocation and more fine grained 156 searching. 157 158Bug fixes: 159 160* [BUG 3981d2ad](https://github.com/rust-lang/regex/commit/3981d2ad): 161 Correct outdated documentation on `RegexBuilder::dot_matches_new_line`. 162* [BUG 7ebe4ae0](https://github.com/rust-lang/regex/commit/7ebe4ae0): 163 Correct outdated documentation on `Parser::allow_invalid_utf8` in the 164 `regex-syntax` crate. 165* [BUG 24c7770b](https://github.com/rust-lang/regex/commit/24c7770b): 166 Fix a bug in the HIR printer where it wouldn't correctly escape meta 167 characters in character classes. 168 169 1701.0.1 (2018-06-19) 171================== 172This release upgrades regex's Unicode tables to Unicode 11, and enables SIMD 173optimizations automatically on Rust stable (1.27 or newer). 174 175New features: 176 177* [FEATURE #486](https://github.com/rust-lang/regex/pull/486): 178 Implement `size_hint` on `RegexSet` match iterators. 179* [FEATURE #488](https://github.com/rust-lang/regex/pull/488): 180 Update Unicode tables for Unicode 11. 181* [FEATURE #490](https://github.com/rust-lang/regex/pull/490): 182 SIMD optimizations are now enabled automatically in Rust stable, for versions 183 1.27 and up. No compilation flags or features need to be set. CPU support 184 SIMD is detected automatically at runtime. 185 186Bug fixes: 187 188* [BUG #482](https://github.com/rust-lang/regex/pull/482): 189 Present a better compilation error when the `use_std` feature isn't used. 190 191 1921.0.0 (2018-05-01) 193================== 194This release marks the 1.0 release of regex. 195 196While this release includes some breaking changes, most users of older versions 197of the regex library should be able to migrate to 1.0 by simply bumping the 198version number. The important changes are as follows: 199 200* We adopt Rust 1.20 as the new minimum supported version of Rust for regex. 201 We also tentativley adopt a policy that permits bumping the minimum supported 202 version of Rust in minor version releases of regex, but no patch releases. 203 That is, with respect to semver, we do not strictly consider bumping the 204 minimum version of Rust to be a breaking change, but adopt a conservative 205 stance as a compromise. 206* Octal syntax in regular expressions has been disabled by default. This 207 permits better error messages that inform users that backreferences aren't 208 available. Octal syntax can be re-enabled via the corresponding option on 209 `RegexBuilder`. 210* `(?-u:\B)` is no longer allowed in Unicode regexes since it can match at 211 invalid UTF-8 code unit boundaries. `(?-u:\b)` is still allowed in Unicode 212 regexes. 213* The `From<regex_syntax::Error>` impl has been removed. This formally removes 214 the public dependency on `regex-syntax`. 215* A new feature, `use_std`, has been added and enabled by default. Disabling 216 the feature will result in a compilation error. In the future, this may 217 permit us to support `no_std` environments (w/ `alloc`) in a backwards 218 compatible way. 219 220For more information and discussion, please see 221[1.0 release tracking issue](https://github.com/rust-lang/regex/issues/457). 222 223 2240.2.11 (2018-05-01) 225=================== 226This release primarily contains bug fixes. Some of them resolve bugs where 227the parser could panic. 228 229New features: 230 231* [FEATURE #459](https://github.com/rust-lang/regex/pull/459): 232 Include C++'s standard regex library and Boost's regex library in the 233 benchmark harness. We now include D/libphobos, C++/std, C++/boost, Oniguruma, 234 PCRE1, PCRE2, RE2 and Tcl in the harness. 235 236Bug fixes: 237 238* [BUG #445](https://github.com/rust-lang/regex/issues/445): 239 Clarify order of indices returned by RegexSet match iterator. 240* [BUG #461](https://github.com/rust-lang/regex/issues/461): 241 Improve error messages for invalid regexes like `[\d-a]`. 242* [BUG #464](https://github.com/rust-lang/regex/issues/464): 243 Fix a bug in the error message pretty printer that could cause a panic when 244 a regex contained a literal `\n` character. 245* [BUG #465](https://github.com/rust-lang/regex/issues/465): 246 Fix a panic in the parser that was caused by applying a repetition operator 247 to `(?flags)`. 248* [BUG #466](https://github.com/rust-lang/regex/issues/466): 249 Fix a bug where `\pC` was not recognized as an alias for `\p{Other}`. 250* [BUG #470](https://github.com/rust-lang/regex/pull/470): 251 Fix a bug where literal searches did more work than necessary for anchored 252 regexes. 253 254 2550.2.10 (2018-03-16) 256=================== 257This release primarily updates the regex crate to changes made in `std::arch` 258on nightly Rust. 259 260New features: 261 262* [FEATURE #458](https://github.com/rust-lang/regex/pull/458): 263 The `Hir` type in `regex-syntax` now has a printer. 264 265 2660.2.9 (2018-03-12) 267================== 268This release introduces a new nightly only feature, `unstable`, which enables 269SIMD optimizations for certain types of regexes. No additional compile time 270options are necessary, and the regex crate will automatically choose the 271best CPU features at run time. As a result, the `simd` (nightly only) crate 272dependency has been dropped. 273 274New features: 275 276* [FEATURE #456](https://github.com/rust-lang/regex/pull/456): 277 The regex crate now includes AVX2 optimizations in addition to the extant 278 SSSE3 optimization. 279 280Bug fixes: 281 282* [BUG #455](https://github.com/rust-lang/regex/pull/455): 283 Fix a bug where `(?x)[ / - ]` failed to parse. 284 285 2860.2.8 (2018-03-12) 287================== 288Bug gixes: 289 290* [BUG #454](https://github.com/rust-lang/regex/pull/454): 291 Fix a bug in the nest limit checker being too aggressive. 292 293 2940.2.7 (2018-03-07) 295================== 296This release includes a ground-up rewrite of the regex-syntax crate, which has 297been in development for over a year. 298 299New features: 300 301* Error messages for invalid regexes have been greatly improved. You get these 302 automatically; you don't need to do anything. In addition to better 303 formatting, error messages will now explicitly call out the use of look 304 around. When regex 1.0 is released, this will happen for backreferences as 305 well. 306* Full support for intersection, difference and symmetric difference of 307 character classes. These can be used via the `&&`, `--` and `~~` binary 308 operators within classes. 309* A Unicode Level 1 conformat implementation of `\p{..}` character classes. 310 Things like `\p{scx:Hira}`, `\p{age:3.2}` or `\p{Changes_When_Casefolded}` 311 now work. All property name and value aliases are supported, and properties 312 are selected via loose matching. e.g., `\p{Greek}` is the same as 313 `\p{G r E e K}`. 314* A new `UNICODE.md` document has been added to this repository that 315 exhaustively documents support for UTS#18. 316* Empty sub-expressions are now permitted in most places. That is, `()+` is 317 now a valid regex. 318* Almost everything in regex-syntax now uses constant stack space, even when 319 performing anaylsis that requires structural induction. This reduces the risk 320 of a user provided regular expression causing a stack overflow. 321* [FEATURE #174](https://github.com/rust-lang/regex/issues/174): 322 The `Ast` type in `regex-syntax` now contains span information. 323* [FEATURE #424](https://github.com/rust-lang/regex/issues/424): 324 Support `\u`, `\u{...}`, `\U` and `\U{...}` syntax for specifying code points 325 in a regular expression. 326* [FEATURE #449](https://github.com/rust-lang/regex/pull/449): 327 Add a `Replace::by_ref` adapter for use of a replacer without consuming it. 328 329Bug fixes: 330 331* [BUG #446](https://github.com/rust-lang/regex/issues/446): 332 We re-enable the Boyer-Moore literal matcher. 333 334 3350.2.6 (2018-02-08) 336================== 337Bug fixes: 338 339* [BUG #446](https://github.com/rust-lang/regex/issues/446): 340 Fixes a bug in the new Boyer-Moore searcher that results in a match failure. 341 We fix this bug by temporarily disabling Boyer-Moore. 342 343 3440.2.5 (2017-12-30) 345================== 346Bug fixes: 347 348* [BUG #437](https://github.com/rust-lang/regex/issues/437): 349 Fixes a bug in the new Boyer-Moore searcher that results in a panic. 350 351 3520.2.4 (2017-12-30) 353================== 354New features: 355 356* [FEATURE #348](https://github.com/rust-lang/regex/pull/348): 357 Improve performance for capture searches on anchored regex. 358 (Contributed by @ethanpailes. Nice work!) 359* [FEATURE #419](https://github.com/rust-lang/regex/pull/419): 360 Expand literal searching to include Tuned Boyer-Moore in some cases. 361 (Contributed by @ethanpailes. Nice work!) 362 363Bug fixes: 364 365* [BUG](https://github.com/rust-lang/regex/pull/436): 366 The regex compiler plugin has been removed. 367* [BUG](https://github.com/rust-lang/regex/pull/436): 368 `simd` has been bumped to `0.2.1`, which fixes a Rust nightly build error. 369* [BUG](https://github.com/rust-lang/regex/pull/436): 370 Bring the benchmark harness up to date. 371 372 3730.2.3 (2017-11-30) 374================== 375New features: 376 377* [FEATURE #374](https://github.com/rust-lang/regex/pull/374): 378 Add `impl From<Match> for &str`. 379* [FEATURE #380](https://github.com/rust-lang/regex/pull/380): 380 Derive `Clone` and `PartialEq` on `Error`. 381* [FEATURE #400](https://github.com/rust-lang/regex/pull/400): 382 Update to Unicode 10. 383 384Bug fixes: 385 386* [BUG #375](https://github.com/rust-lang/regex/issues/375): 387 Fix a bug that prevented the bounded backtracker from terminating. 388* [BUG #393](https://github.com/rust-lang/regex/issues/393), 389 [BUG #394](https://github.com/rust-lang/regex/issues/394): 390 Fix bug with `replace` methods for empty matches. 391 392 3930.2.2 (2017-05-21) 394================== 395New features: 396 397* [FEATURE #341](https://github.com/rust-lang/regex/issues/341): 398 Support nested character classes and intersection operation. 399 For example, `[\p{Greek}&&\pL]` matches greek letters and 400 `[[0-9]&&[^4]]` matches every decimal digit except `4`. 401 (Much thanks to @robinst, who contributed this awesome feature.) 402 403Bug fixes: 404 405* [BUG #321](https://github.com/rust-lang/regex/issues/321): 406 Fix bug in literal extraction and UTF-8 decoding. 407* [BUG #326](https://github.com/rust-lang/regex/issues/326): 408 Add documentation tip about the `(?x)` flag. 409* [BUG #333](https://github.com/rust-lang/regex/issues/333): 410 Show additional replacement example using curly braces. 411* [BUG #334](https://github.com/rust-lang/regex/issues/334): 412 Fix bug when resolving captures after a match. 413* [BUG #338](https://github.com/rust-lang/regex/issues/338): 414 Add example that uses `Captures::get` to API documentation. 415* [BUG #353](https://github.com/rust-lang/regex/issues/353): 416 Fix RegexSet bug that caused match failure in some cases. 417* [BUG #354](https://github.com/rust-lang/regex/pull/354): 418 Fix panic in parser when `(?x)` is used. 419* [BUG #358](https://github.com/rust-lang/regex/issues/358): 420 Fix literal optimization bug with RegexSet. 421* [BUG #359](https://github.com/rust-lang/regex/issues/359): 422 Fix example code in README. 423* [BUG #365](https://github.com/rust-lang/regex/pull/365): 424 Fix bug in `rure_captures_len` in the C binding. 425* [BUG #367](https://github.com/rust-lang/regex/issues/367): 426 Fix byte class bug that caused a panic. 427 428 4290.2.1 430===== 431One major bug with `replace_all` has been fixed along with a couple of other 432touchups. 433 434* [BUG #312](https://github.com/rust-lang/regex/issues/312): 435 Fix documentation for `NoExpand` to reference correct lifetime parameter. 436* [BUG #314](https://github.com/rust-lang/regex/issues/314): 437 Fix a bug with `replace_all` when replacing a match with the empty string. 438* [BUG #316](https://github.com/rust-lang/regex/issues/316): 439 Note a missing breaking change from the `0.2.0` CHANGELOG entry. 440 (`RegexBuilder::compile` was renamed to `RegexBuilder::build`.) 441* [BUG #324](https://github.com/rust-lang/regex/issues/324): 442 Compiling `regex` should only require one version of `memchr` crate. 443 444 4450.2.0 446===== 447This is a new major release of the regex crate, and is an implementation of the 448[regex 1.0 RFC](https://github.com/rust-lang/rfcs/blob/master/text/1620-regex-1.0.md). 449We are releasing a `0.2` first, and if there are no major problems, we will 450release a `1.0` shortly. For `0.2`, the minimum *supported* Rust version is 4511.12. 452 453There are a number of **breaking changes** in `0.2`. They are split into two 454types. The first type correspond to breaking changes in regular expression 455syntax. The second type correspond to breaking changes in the API. 456 457Breaking changes for regex syntax: 458 459* POSIX character classes now require double bracketing. Previously, the regex 460 `[:upper:]` would parse as the `upper` POSIX character class. Now it parses 461 as the character class containing the characters `:upper:`. The fix to this 462 change is to use `[[:upper:]]` instead. Note that variants like 463 `[[:upper:][:blank:]]` continue to work. 464* The character `[` must always be escaped inside a character class. 465* The characters `&`, `-` and `~` must be escaped if any one of them are 466 repeated consecutively. For example, `[&]`, `[\&]`, `[\&\&]`, `[&-&]` are all 467 equivalent while `[&&]` is illegal. (The motivation for this and the prior 468 change is to provide a backwards compatible path for adding character class 469 set notation.) 470* A `bytes::Regex` now has Unicode mode enabled by default (like the main 471 `Regex` type). This means regexes compiled with `bytes::Regex::new` that 472 don't have the Unicode flag set should add `(?-u)` to recover the original 473 behavior. 474 475Breaking changes for the regex API: 476 477* `find` and `find_iter` now **return `Match` values instead of 478 `(usize, usize)`.** `Match` values have `start` and `end` methods, which 479 return the match offsets. `Match` values also have an `as_str` method, 480 which returns the text of the match itself. 481* The `Captures` type now only provides a single iterator over all capturing 482 matches, which should replace uses of `iter` and `iter_pos`. Uses of 483 `iter_named` should use the `capture_names` method on `Regex`. 484* The `at` method on the `Captures` type has been renamed to `get`, and it 485 now returns a `Match`. Similarly, the `name` method on `Captures` now returns 486 a `Match`. 487* The `replace` methods now return `Cow` values. The `Cow::Borrowed` variant 488 is returned when no replacements are made. 489* The `Replacer` trait has been completely overhauled. This should only 490 impact clients that implement this trait explicitly. Standard uses of 491 the `replace` methods should continue to work unchanged. If you implement 492 the `Replacer` trait, please consult the new documentation. 493* The `quote` free function has been renamed to `escape`. 494* The `Regex::with_size_limit` method has been removed. It is replaced by 495 `RegexBuilder::size_limit`. 496* The `RegexBuilder` type has switched from owned `self` method receivers to 497 `&mut self` method receivers. Most uses will continue to work unchanged, but 498 some code may require naming an intermediate variable to hold the builder. 499* The `compile` method on `RegexBuilder` has been renamed to `build`. 500* The free `is_match` function has been removed. It is replaced by compiling 501 a `Regex` and calling its `is_match` method. 502* The `PartialEq` and `Eq` impls on `Regex` have been dropped. If you relied 503 on these impls, the fix is to define a wrapper type around `Regex`, impl 504 `Deref` on it and provide the necessary impls. 505* The `is_empty` method on `Captures` has been removed. This always returns 506 `false`, so its use is superfluous. 507* The `Syntax` variant of the `Error` type now contains a string instead of 508 a `regex_syntax::Error`. If you were examining syntax errors more closely, 509 you'll need to explicitly use the `regex_syntax` crate to re-parse the regex. 510* The `InvalidSet` variant of the `Error` type has been removed since it is 511 no longer used. 512* Most of the iterator types have been renamed to match conventions. If you 513 were using these iterator types explicitly, please consult the documentation 514 for its new name. For example, `RegexSplits` has been renamed to `Split`. 515 516A number of bugs have been fixed: 517 518* [BUG #151](https://github.com/rust-lang/regex/issues/151): 519 The `Replacer` trait has been changed to permit the caller to control 520 allocation. 521* [BUG #165](https://github.com/rust-lang/regex/issues/165): 522 Remove the free `is_match` function. 523* [BUG #166](https://github.com/rust-lang/regex/issues/166): 524 Expose more knobs (available in `0.1`) and remove `with_size_limit`. 525* [BUG #168](https://github.com/rust-lang/regex/issues/168): 526 Iterators produced by `Captures` now have the correct lifetime parameters. 527* [BUG #175](https://github.com/rust-lang/regex/issues/175): 528 Fix a corner case in the parsing of POSIX character classes. 529* [BUG #178](https://github.com/rust-lang/regex/issues/178): 530 Drop the `PartialEq` and `Eq` impls on `Regex`. 531* [BUG #179](https://github.com/rust-lang/regex/issues/179): 532 Remove `is_empty` from `Captures` since it always returns false. 533* [BUG #276](https://github.com/rust-lang/regex/issues/276): 534 Position of named capture can now be retrieved from a `Captures`. 535* [BUG #296](https://github.com/rust-lang/regex/issues/296): 536 Remove winapi/kernel32-sys dependency on UNIX. 537* [BUG #307](https://github.com/rust-lang/regex/issues/307): 538 Fix error on emscripten. 539 540 5410.1.80 542====== 543* [PR #292](https://github.com/rust-lang/regex/pull/292): 544 Fixes bug #291, which was introduced by PR #290. 545 5460.1.79 547====== 548* Require regex-syntax 0.3.8. 549 5500.1.78 551====== 552* [PR #290](https://github.com/rust-lang/regex/pull/290): 553 Fixes bug #289, which caused some regexes with a certain combination 554 of literals to match incorrectly. 555 5560.1.77 557====== 558* [PR #281](https://github.com/rust-lang/regex/pull/281): 559 Fixes bug #280 by disabling all literal optimizations when a pattern 560 is partially anchored. 561 5620.1.76 563====== 564* Tweak criteria for using the Teddy literal matcher. 565 5660.1.75 567====== 568* [PR #275](https://github.com/rust-lang/regex/pull/275): 569 Improves match verification performance in the Teddy SIMD searcher. 570* [PR #278](https://github.com/rust-lang/regex/pull/278): 571 Replaces slow substring loop in the Teddy SIMD searcher with Aho-Corasick. 572* Implemented DoubleEndedIterator on regex set match iterators. 573 5740.1.74 575====== 576* Release regex-syntax 0.3.5 with a minor bug fix. 577* Fix bug #272. 578* Fix bug #277. 579* [PR #270](https://github.com/rust-lang/regex/pull/270): 580 Fixes bugs #264, #268 and an unreported where the DFA cache size could be 581 drastically under estimated in some cases (leading to high unexpected memory 582 usage). 583 5840.1.73 585====== 586* Release `regex-syntax 0.3.4`. 587* Bump `regex-syntax` dependency version for `regex` to `0.3.4`. 588 5890.1.72 590====== 591* [PR #262](https://github.com/rust-lang/regex/pull/262): 592 Fixes a number of small bugs caught by fuzz testing (AFL). 593 5940.1.71 595====== 596* [PR #236](https://github.com/rust-lang/regex/pull/236): 597 Fix a bug in how suffix literals were extracted, which could lead 598 to invalid match behavior in some cases. 599 6000.1.70 601====== 602* [PR #231](https://github.com/rust-lang/regex/pull/231): 603 Add SIMD accelerated multiple pattern search. 604* [PR #228](https://github.com/rust-lang/regex/pull/228): 605 Reintroduce the reverse suffix literal optimization. 606* [PR #226](https://github.com/rust-lang/regex/pull/226): 607 Implements NFA state compression in the lazy DFA. 608* [PR #223](https://github.com/rust-lang/regex/pull/223): 609 A fully anchored RegexSet can now short-circuit. 610 6110.1.69 612====== 613* [PR #216](https://github.com/rust-lang/regex/pull/216): 614 Tweak the threshold for running backtracking. 615* [PR #217](https://github.com/rust-lang/regex/pull/217): 616 Add upper limit (from the DFA) to capture search (for the NFA). 617* [PR #218](https://github.com/rust-lang/regex/pull/218): 618 Add rure, a C API. 619 6200.1.68 621====== 622* [PR #210](https://github.com/rust-lang/regex/pull/210): 623 Fixed a performance bug in `bytes::Regex::replace` where `extend` was used 624 instead of `extend_from_slice`. 625* [PR #211](https://github.com/rust-lang/regex/pull/211): 626 Fixed a bug in the handling of word boundaries in the DFA. 627* [PR #213](https://github.com/rust-lang/pull/213): 628 Added RE2 and Tcl to the benchmark harness. Also added a CLI utility from 629 running regexes using any of the following regex engines: PCRE1, PCRE2, 630 Oniguruma, RE2, Tcl and of course Rust's own regexes. 631 6320.1.67 633====== 634* [PR #201](https://github.com/rust-lang/regex/pull/201): 635 Fix undefined behavior in the `regex!` compiler plugin macro. 636* [PR #205](https://github.com/rust-lang/regex/pull/205): 637 More improvements to DFA performance. Competitive with RE2. See PR for 638 benchmarks. 639* [PR #209](https://github.com/rust-lang/regex/pull/209): 640 Release 0.1.66 was semver incompatible since it required a newer version 641 of Rust than previous releases. This PR fixes that. (And `0.1.66` was 642 yanked.) 643 6440.1.66 645====== 646* Speculative support for Unicode word boundaries was added to the DFA. This 647 should remove the last common case that disqualified use of the DFA. 648* An optimization that scanned for suffix literals and then matched the regular 649 expression in reverse was removed because it had worst case quadratic time 650 complexity. It was replaced with a more limited optimization where, given any 651 regex of the form `re$`, it will be matched in reverse from the end of the 652 haystack. 653* [PR #202](https://github.com/rust-lang/regex/pull/202): 654 The inner loop of the DFA was heavily optimized to improve cache locality 655 and reduce the overall number of instructions run on each iteration. This 656 represents the first use of `unsafe` in `regex` (to elide bounds checks). 657* [PR #200](https://github.com/rust-lang/regex/pull/200): 658 Use of the `mempool` crate (which used thread local storage) was replaced 659 with a faster version of a similar API in @Amanieu's `thread_local` crate. 660 It should reduce contention when using a regex from multiple threads 661 simultaneously. 662* PCRE2 JIT benchmarks were added. A benchmark comparison can be found 663 [here](https://gist.github.com/anonymous/14683c01993e91689f7206a18675901b). 664 (Includes a comparison with PCRE1's JIT and Oniguruma.) 665* A bug where word boundaries weren't being matched correctly in the DFA was 666 fixed. This only affected use of `bytes::Regex`. 667* [#160](https://github.com/rust-lang/regex/issues/160): 668 `Captures` now has a `Debug` impl. 669