diff --git a/doc/ed.texi b/doc/ed.texi
index c07aad1..c81a8f6 100644
--- a/doc/ed.texi
+++ b/doc/ed.texi
@@ -381,6 +381,9 @@ Print an informative help message describing the options and exit.
 Print the version number of @command{ed} on the standard output and exit.
 This version number should be included in all bug reports.
 
+@item -E
+Use Posix Extended Regular Expression syntax instead of Basic.
+
 @item -G
 @itemx --traditional
 Forces backwards compatibility. This affects the behavior of the
@@ -554,7 +557,8 @@ that point is matched.
 
 A null @var{re} is equivalent to the last @var{re} encountered.
 
-The following symbols are used in constructing regular expressions:
+The following symbols are used in constructing regular expressions,
+using standard POSIX Basic Regular Expression Syntax:
 
 @table @code
 
@@ -641,6 +645,15 @@ forms occurs first in a regular expression or subexpression, then it is
 interpreted literally (i.e., the regular expression @samp{\@{2\@}}
 matches the string @samp{@{2@}}, and so on).
 
+@end table
+
+The following extensions to basic regular expression operators are
+preceded by a backslash @samp{\} to distinguish them from traditional
+@command{ed} syntax.  They may be unavailable depending on the
+particular regex implementation in your system.
+
+@table @code
+
 @item \<
 @itemx \>
 Anchors the single character regular expression or subexpression
@@ -648,15 +661,6 @@ immediately following it to the beginning (in the case of @samp{\<}) or
 ending (in the case of @samp{\>}) of a @dfn{word}, i.e., in ASCII, a
 maximal string of alphanumeric characters, including the underscore (_).
 
-@end table
-
-The following extended regular expression operators are preceded by a
-backslash @samp{\} to distinguish them from traditional @command{ed} syntax.
-They may be unavailable depending on the particular regex implementation in
-your system.
-
-@table @code
-
 @item  \`
 @itemx \'
 Unconditionally matches the beginning @samp{\`} or ending @samp{\'} of a line.
@@ -692,6 +696,11 @@ Matches any character not in a word.
 
 @end table
 
+If invoked with the @samp{-E} option, POSIX Extended Regular
+Expression syntax is used instead. @samp{|}, @samp{+} and @samp{?} are
+available (Without a leading backlash), and subexpressions and
+repetition counts (Parenthesis and curly brackets) don't need a
+leading backslash.
 
 @node Commands
 @chapter Commands
diff --git a/main.c b/main.c
index b4e5850..3c88fdf 100644
--- a/main.c
+++ b/main.c
@@ -51,6 +51,7 @@ static bool scripted_ = false;		/* if set, suppress diagnostics,
 					   byte counts and '!' prompt */
 static bool traditional_ = false;	/* if set, be backwards compatible */
 
+extern int use_extended_re;
 
 bool restricted( void ) { return restricted_; }
 bool scripted( void ) { return scripted_; }
@@ -76,6 +77,7 @@ static void show_help( void )
           "  -r, --restricted           run in restricted mode\n"
           "  -s, --quiet, --silent      suppress diagnostics, byte counts and '!' prompt\n"
           "  -v, --verbose              be verbose; equivalent to the 'H' command\n"
+          "  -E                         use Extended Regular Expression syntax\n"
           "\nStart edit by reading in 'file' if given.\n"
           "If 'file' begins with a '!', read output of shell command.\n"
           "\nExit status: 0 for a normal exit, 1 for environmental problems (file\n"
@@ -156,6 +158,7 @@ int main( const int argc, const char * const argv[] )
     { 's', "silent",            ap_no  },
     { 'v', "verbose",           ap_no  },
     { 'V', "version",           ap_no  },
+    { 'E',  0,                  ap_no  },
     {  0 ,  0,                  ap_no } };
 
   struct Arg_parser parser;
@@ -181,6 +184,7 @@ int main( const int argc, const char * const argv[] )
       case 's': scripted_ = true; break;
       case 'v': set_verbose(); break;
       case 'V': show_version(); return 0;
+      case 'E': use_extended_re = 1; break;
       default : show_error( "internal error: uncaught option.", 0, false );
                 return 3;
       }
diff --git a/regex.c b/regex.c
index 9e51635..b5bf80b 100644
--- a/regex.c
+++ b/regex.c
@@ -34,6 +34,8 @@ static int rbufsz = 0;		/* replacement buffer size */
 static int rlen = 0;		/* replacement length */
 
 
+int use_extended_re = 0; /* Non-0 to use ERE syntax */
+
 bool subst_regex( void ) { return subst_regex_ != 0; }
 
 
@@ -128,7 +130,7 @@ static regex_t * get_compiled_regex( const char ** const ibufpp,
   /* exp compiled && not copied */
   if( exp && exp != subst_regex_ ) regfree( exp );
   else exp = ( &store[0] != subst_regex_ ) ? &store[0] : &store[1];
-  n = regcomp( exp, pat, 0 );
+  n = regcomp( exp, pat, use_extended_re ? REG_EXTENDED : 0 );
   if( n )
     {
     char buf[80];
