On Sun, Jun 04, 2017 at 02:52:36PM +0200, Dominique d'Humières wrote: > >> - regexp "(\[0-9\]+)\[ \t\]+(?:(?:#)?\[ \t\]*include\[ > >> \t\]+)\[\"\](\[^\"\]*)\[\"\]" $i dummy lineno include_file > >> + regexp -nocase > >> "(\[0-9\]+)\\s+(?:(?:#)?\\s*include\\s+)\[\"\'\](\[^\"\'\]*)\[\"\'\]" $i > >> dummy lineno include_file > > > > My regex sorcery may be a bit rusty, but why does \\s need a double > > escape while \t appears with single escape? > > I have used the Segher’s tips.
Nah, that wasn't a tip. A tip is: don't use double quotes unless you actually want double quotes. You can write this as: regexp -nocase {([0-9]+)\s+(?:(?:#)?\s*include\s+)["']([^"']*)["']} $i dummy lineno include_file or even regexp -nocase {([0-9]+)\s+#?\s*include\s+["']([^"']*)["']} $i dummy lineno include_file (where I removed the useless (?:) groups as well). You want double quotes if you want command substitution ("bla[stuff]bla"), variable substitution ("$something"), or backslash substitution (like "\t" becomes a tab char). In a regexp you do not usually have any use for this, and it hurts so much. Segher