bongho6k downloadsFind and replace text using regular expressions with real-time preview and match highlighting.
Safely clean up Markdown in Obsidian with live previews, match highlighting, and reusable multi-step pipelines.
Preview every change before it touches your note. Run a one-off replacement or save a complete cleanup workflow for PDFs, AI-generated text, and Markdown.
| Capability | Obsidian's built-in replace | Regex Replace |
|---|---|---|
| Regular expressions and capture groups | — | ✓ |
| Before/after preview | — | ✓ |
| Match highlighting | — | ✓ |
| Replace within a selection | — | ✓ |
| Reusable multi-step cleanup pipelines | — | ✓ |
| Import regex-pipeline rulesets | — | ✓ |
Everything runs locally in your vault. The plugin does not send note content to external services.
$1, $2, etc.)g), case-insensitive (i), and multiline (m) flagsCopy a search and replacement into Regex Replace, review the preview, and apply it only when the result is correct for your note.
| Cleanup | Search | Replace | Flags |
|---|---|---|---|
| Collapse repeated spaces | {2,} |
|
g |
| Remove trailing whitespace | [ \t]+$ |
(empty) | gm |
| Collapse 3+ blank lines | \n{3,} |
\n\n |
g |
| Change H2 headings to H3 | ^## |
### |
gm |
| Convert ISO dates to day/month/year | (\d{4})-(\d{2})-(\d{2}) |
$3/$2/$1 |
g |
| Remove Markdown bold markers | \*\*([^*]+)\*\* |
$1 |
g |
| Convert simple wiki links to Markdown links | `[[([^] | ]+)]]` | [$1]($1.md) |
[!CAUTION] A regular expression can match more text than intended. Check the highlighted preview before applying a replacement, especially with broad patterns.
Requires Obsidian 1.13.0 or later — the settings tab uses the declarative settings API introduced in that version, so its settings appear in Obsidian's settings search. Version 1.1.5 remains available for older releases.
main.js, manifest.json, and styles.css from the latest release<YourVault>/.obsidian/plugins/regex-replace/Cmd/Ctrl + Shift + HCmd/Ctrl + P → "Open Regex Replace"+--------------------------------------+
| Search pattern: \b(world)\b |
| Replace with: WORLD |
| |
| Flags: [x] g [ ] i [ ] m |
| [ ] Replace in selection only |
| |
| 2 match(es) found |
| |
| Preview |
| Before: Hello world, hello world |
| After: Hello WORLD, hello WORLD |
| |
| 2 match(es): |
| - "world" -> "WORLD" |
| |
| [ Replace all ] [ Cancel ] |
+--------------------------------------+
Before highlights every match in yellow, and After highlights each
replacement in green. Previously used patterns reappear in a Recent
patterns dropdown below the preview.
| Use Case | Search Pattern | Replace | Result |
|---|---|---|---|
| Find numbers | \d+ |
[NUM] |
abc123 → abc[NUM] |
| Date format | (\d{4})-(\d{2})-(\d{2}) |
$3/$2/$1 |
2024-12-08 → 08/12/2024 |
| Remove extra spaces | \s+ |
|
Multiple spaces → single |
| Wiki to MD link | \[\[(.+?)\]\] |
[$1]($1.md) |
[[Note]] → [Note](Note.md) |
| Header H2 → H3 | ^## |
### |
## Title → ### Title |
| Remove bold | \*\*(.+?)\*\* |
$1 |
**bold** → bold |
| Extract link text | \[(.+?)\]\((.+?)\) |
$1: $2 |
[text](url) → text: url |
| Flag | Name | Description |
|---|---|---|
g |
Global | Replace all matches (not just the first) |
i |
Ignore Case | Case-insensitive matching |
m |
Multiline | ^ and $ match line starts/ends |
Use parentheses () to capture groups and reference them with $1, $2, etc.:
Search: (\w+)@(\w+)\.com
Replace: User: $1, Domain: $2
Input: [email protected]
Output: User: test, Domain: example
A ruleset is a named list of find/replace rules applied in sequence — each rule operates on the previous rule's output. Useful for repeatable, multi-step cleanups (e.g. normalize headers, then collapse whitespace, then fix links).
In Settings → Regex Replace → Pipeline rulesets, click Add ruleset, name it, and write rules using regex-pipeline syntax (one rule per block):
"SEARCH"->"REPLACE"
"\s+"->" "
"##\s"gm->"### "
"foo"gi->"bar"); without them, gm is used.Ruleset: <name> command, bindable
to a hotkey or a Commander / Editing Toolbar button.Turn on Apply to selection only — either on the ruleset itself in settings,
or with the checkbox in the pipeline dialog. Both write to the same stored
value, so the choice survives the next open and applies to the Ruleset: <name>
hotkey too.
When such a ruleset runs with nothing selected, it does nothing and shows a notice. It never falls back to the whole note, so a mis-fired hotkey cannot rewrite the file. Apply to selection only by default seeds the flag on newly added and imported rulesets, and rulesets saved before this option existed follow it until their own toggle is set.
Click Import from regex-pipeline to read every ruleset file in
<vault>/.obsidian/regex-rulesets/ and convert it into a native ruleset.
This ruleset removes trailing whitespace, reduces large blank gaps, and normalizes repeated spaces. Add it under Settings → Regex Replace → Pipeline rulesets, then preview it with Apply ruleset (pipeline).
"[ \\t]+$"gm->""
"\\n{3,}"g->"\\n\\n"
" {2,}"g->" "
Access via Settings → Regex Replace:
| Setting | Description | Default |
|---|---|---|
| Default Flags | Pre-selected regex flags | g |
| Show Preview | Display before/after preview | true |
| History Limit | Max saved patterns | 10 |
| Pipeline rulesets | Add/edit/delete/import reusable rulesets | — |
| Apply to selection only by default | Seeds the flag on new and imported rulesets | false |
# Clone the repository
git clone https://github.com/bongho/obsidian-regex-replace.git
# Install dependencies
npm install
# Build for development (watch mode)
npm run dev
# Build for production
npm run build
# Run tests
npx ts-node --transpile-only test.ts
Ruleset: <name> commands, which previously always rewrote the whole notedisplay() fallback; the settings tab is declarative onlyminAppVersion to 1.13.0 — vaults below it stay on 1.1.5 via versions.jsondocument.createElement calls with Obsidian's createEl helperssrc/engine.ts0BSD License — see LICENSE for details.
Contributions are welcome! Please feel free to submit a Pull Request.
If you find this plugin useful, consider:
Maintained by Bongho Lee, a Korean developer and AI researcher. Feedback, issues, and pull requests are welcome!
Made with ❤️ for the Obsidian community