diff options
| author | Andrew Gallant <jamslam@gmail.com> | 2014-06-03 23:04:59 -0400 |
|---|---|---|
| committer | Andrew Gallant <jamslam@gmail.com> | 2014-06-03 23:04:59 -0400 |
| commit | 9d39178f2f60b6076e4bd00e263f2304084f34b4 (patch) | |
| tree | 79d7933e3f1461c45acb51d1162e7cbcae50dba0 | |
| parent | f5ead0dd66ab7c3aaaaabcc34e1726a4acd74b07 (diff) | |
| download | rust-9d39178f2f60b6076e4bd00e263f2304084f34b4.tar.gz rust-9d39178f2f60b6076e4bd00e263f2304084f34b4.zip | |
Fixes #13843.
An empty regex is a valid regex that always matches. This behavior is consistent with at least Go and Python. A couple regression tests are included.
| -rw-r--r-- | src/libregex/parse/mod.rs | 3 | ||||
| -rw-r--r-- | src/libregex/test/tests.rs | 14 |
2 files changed, 17 insertions, 0 deletions
diff --git a/src/libregex/parse/mod.rs b/src/libregex/parse/mod.rs index bd2e454a9f8..14e34b805a3 100644 --- a/src/libregex/parse/mod.rs +++ b/src/libregex/parse/mod.rs @@ -201,6 +201,9 @@ pub fn parse(s: &str) -> Result<Ast, Error> { impl<'a> Parser<'a> { fn parse(&mut self) -> Result<Ast, Error> { + if self.chars.len() == 0 { + return Ok(Nothing); + } loop { let c = self.cur(); match c { diff --git a/src/libregex/test/tests.rs b/src/libregex/test/tests.rs index 68d43156ae6..35cb7c3c5b0 100644 --- a/src/libregex/test/tests.rs +++ b/src/libregex/test/tests.rs @@ -28,6 +28,20 @@ fn split() { assert_eq!(subs, vec!("cauchy", "plato", "tyler", "binx")); } +#[test] +fn empty_regex_empty_match() { + let re = regex!(""); + let ms = re.find_iter("").collect::<Vec<(uint, uint)>>(); + assert_eq!(ms, vec![(0, 0)]); +} + +#[test] +fn empty_regex_nonempty_match() { + let re = regex!(""); + let ms = re.find_iter("abc").collect::<Vec<(uint, uint)>>(); + assert_eq!(ms, vec![(0, 0), (1, 1), (2, 2), (3, 3)]); +} + macro_rules! replace( ($name:ident, $which:ident, $re:expr, $search:expr, $replace:expr, $result:expr) => ( |
