Skip to content
Back to skills

Powershell Regex Backreference

ASecurity

PowerShell regex backreference syntax pitfalls — dollar-sign escaping in replacement strings

  • 4 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 3, 2026
ai-agentsjavascriptpythongojavashelldebugginggitapi

Works with

  • api

Security analysis

A100/100

Scanned September 3, 2026

npx -y skills add fabioc-aloha/Alex_Skill_Mall --skill powershell-regex-backreference --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Powershell Regex Backreference?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Powershell Regex Backreference
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/fabioc-aloha-powershell-regex-backreference/badge)](https://www.skillsdirectory.com/skills/fabioc-aloha-powershell-regex-backreference)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: powershell-regex-backreference
description: "PowerShell regex backreference syntax pitfalls — dollar-sign escaping in replacement strings"
lastReviewed: 2026-04-30
---

# PowerShell Regex Backreference Ambiguity

**Category**: Cross-Platform
**Time Saved**: 30+ minutes debugging "wrong capture group"
**Battle-tested**: Yes — Alex extension scripts

---

## The Problem

Your PowerShell regex replacement isn't working right. You want to capture a group and append "0" to it, but the output is wrong or empty.

```powershell
# You want: "v1" → "v10"
$version = "v1"
$result = $version -replace 'v(\d+)', 'v$10'
# Expected: "v10"
# Actual: "" or garbage — $10 is capture group 10, not $1 + "0"
```

## Why It Happens

PowerShell (and many regex engines) interpret `$1` followed by a digit as a **multi-digit backreference**. `$10` means "capture group 10", not "capture group 1 followed by the character 0".

## The Rule

**Use `${n}` syntax or named groups when backreference is followed by a digit**

```powershell
# ❌ AMBIGUOUS — $10 = capture group 10
$result = $version -replace 'v(\d+)', 'v$10'

# ✅ EXPLICIT — ${1} clearly separates backreference from literal
$result = $version -replace 'v(\d+)', 'v${1}0'

# ✅ NAMED GROUP — even clearer
$result = $version -replace 'v(?<major>\d+)', 'v${major}0'
```

## Safe Patterns

| Scenario | Pattern | Replacement |
|----------|---------|-------------|
| Backreference + digit | `(\d+)` | `${1}0` |
| Backreference + letter | `(\d+)` | `$1x` (safe, no ambiguity) |
| Multiple groups | `(\d+)\.(\d+)` | `${1}_${2}` |
| Named groups | `(?<major>\d+)` | `${major}` |

## Real-World Example

Bumping a version number:

```powershell
# Increment patch version: 1.2.3 → 1.2.4
$version = "1.2.3"

# ❌ BROKEN — if you tried to append to group
$result = $version -replace '(\d+)\.(\d+)\.(\d+)', '$1.$2.$30'  # $30!

# ✅ CORRECT — use script block for arithmetic
$result = $version -replace '(\d+)\.(\d+)\.(\d+)', {
    "$($_.Groups[1].Value).$($_.Groups[2].Value).$([int]$_.Groups[3].Value + 1)"
}
```

## Cross-Platform Note

This ambiguity exists in:

- PowerShell (`-replace`)
- .NET (`Regex.Replace`)
- JavaScript (`String.replace` with function)
- Python (`re.sub`)

The `${n}` syntax works in PowerShell and .NET. JavaScript and Python have their own escaping rules.

## Verification

```powershell
# Test your pattern with simple input first
"test1" -replace '(\w+)(\d)', '${1}X${2}Y'
# Expected: "testX1Y"
```

---

**Source**: Promoted from AI-Memory global-knowledge.md (2026-04-27)

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…