about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAndrew Gallant <jamslam@gmail.com>2014-06-03 23:04:59 -0400
committerAndrew Gallant <jamslam@gmail.com>2014-06-03 23:04:59 -0400
commit9d39178f2f60b6076e4bd00e263f2304084f34b4 (patch)
tree79d7933e3f1461c45acb51d1162e7cbcae50dba0
parentf5ead0dd66ab7c3aaaaabcc34e1726a4acd74b07 (diff)
downloadrust-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.rs3
-rw-r--r--src/libregex/test/tests.rs14
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) => (