Replacing regexes in Drafts
October 28, 2018 at 8:24 PM by Dr. Drang
If you’re a longtime regular expression user, you may be surprised at how the Find and Replace feature in Drafts works. The Find part is normal, but the Replace is a little different.
Let’s assume we have a set of book titles with subtitles set off by colons1:
The Films of Fritz Lang: Allegories of Vision and Modernity
In Pharaoh's Army: Memories of the Lost War
Understanding Comics: The Invisible Art
A Matter of Interpretation: Federal Courts and the Law
The Digital Dialectic: New Essays on New Media
I Saw Esau: The Schoolchild's Pocket Book
We’d like to reformat these titles by putting each subtitle on an indented line under the main title and then separating them all with blank lines. Like this:
The Films of Fritz Lang
Allegories of Vision and Modernity
In Pharaoh's Army
Memories of the Lost War
Understanding Comics
The Invisible Art
A Matter of Interpretation
Federal Courts and the Law
The Digital Dialectic
New Essays on New Media
I Saw Esau
The Schoolchild's Pocket Book
For compatibility with the formatting here on the blog, I’ve indented the subtitles above with two spaces, but let’s say we really want them indented with a tab.
If we were working in Perl, and had these titles in a text file, we could do the reformatting with this one-liner:
perl -pe 's/^(.+): (.+)$/$1\n\t$2\n/' titles.txt
where the find regex is
^(.+): (.+)$
and the replace regex is
$1\n\t$2\n
Most regular expression engines nowadays take their cues from Perl (Perl 5, anyway), so although Python isn’t really set up for one-liners, the find and replace regexes we’d use in a Python script are the same.
BBEdit’s “Grep” find and replace is basically the same,
The only difference is the use of backslashes instead of dollar signs to identify the parts captured by parentheses.
So if we wanted to do this reformatting in Drafts, it’s only natural to try this:
As you can see from the lower half of the screenshot, the finding part worked as expected, but if we tap the Replace All button, we get this:
The Films of Fritz LangntAllegories of Vision and Modernityn
In Pharaoh's ArmyntMemories of the Lost Warn
Understanding ComicsntThe Invisible Artn
A Matter of InterpretationntFederal Courts and the Lawn
The Digital DialecticntNew Essays on New Median
I Saw EsauntThe Schoolchild's Pocket Bookn
What’s happened is the \n
and \t
in the replacement regex have not been interpreted as newline and tab. Instead, the backslashes have been interpreted as “treat the next character as literal, even if it would normally have a special meaning in a regex,” which is why we see an nt between the main titles and subtitles and an n at the end of each line.
So how do we get what we want? Don’t overthink it. If you want a newline in the replacement, type Return; if you want a tab, type Tab. Like this:
It’s hard to see because the Replace field isn’t tall enough to show three lines at once, but there’s a Return after the $2
.
This is actually easier, but because of years of using \n
and \t
, I almost always type it the Perlish way first.
By the way, if you’re wondering whether you should use “real” tabs and newlines or the backslashed metacharacters in the Find field, the answer is Yes. You can use either one.
-
I plucked these from this GoodReads page. ↩