diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index bbd78092..cb811c98 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -307,11 +307,9 @@ pub fn select_all(cx: &mut Context) {
 pub fn select_regex(cx: &mut Context) {
     let prompt = ui::regex_prompt(cx, "select:".to_string(), |doc, regex| {
         let text = doc.text().slice(..);
-        // TODO: if select on matches returns empty range, we need to abort
-        // if regex empty or no matches, return
-        let selection =
-            selection::select_on_matches(text, doc.selection(), &regex).expect("no matches");
-        doc.set_selection(selection);
+        if let Some(selection) = selection::select_on_matches(text, doc.selection(), &regex) {
+            doc.set_selection(selection);
+        }
     });
 
     cx.push_layer(Box::new(prompt));
diff --git a/helix-term/src/ui/mod.rs b/helix-term/src/ui/mod.rs
index 463ac368..593da3ae 100644
--- a/helix-term/src/ui/mod.rs
+++ b/helix-term/src/ui/mod.rs
@@ -45,6 +45,11 @@ pub fn regex_prompt(
                     //
                 }
                 PromptEvent::Update => {
+                    // skip empty input, TODO: trigger default
+                    if input.is_empty() {
+                        return;
+                    }
+
                     match Regex::new(input) {
                         Ok(regex) => {
                             let view = &mut editor.view_mut();