22

I am having some issues with regular expression mainly because I think the information I can find is not specifically for powershell and all the samples I have tried either error or don't work as intended. I am trying to replace the first occurrence of a word in a string with another word but not replace any other occurrences of that word. for an example take the string:

My name is Bob, her name is Sara.

I would like to replace the first occurrence of name with baby so the resulting string would be

My baby is Bob, her name is Sara.

I have been working in https://regex101.com/ to try to build and see what is selected as I go but as I said none of these have a powershell flavor of regex. In that I can just turn off the global flag and it seems to select the first occurrence but not in powershell. So I am really at a loss of where to begin all really have at this point is selecting all occurrences of the word namewith:

$test = "My name is Bob, her name is Sara."
$test -replace 'name', 'baby'

2 Answers 2

49

One way to replace n times:

$test = "My name is Bob, her name is Sara."
[regex]$pattern = "name"
$pattern.replace($test, "baby", 1) 

> My baby is Bob, her name is Sara
Sign up to request clarification or add additional context in comments.

5 Comments

So the 1 Just says replace the first one you find ? A 2 would replace both then ? If you said 3 and only have 2 words of name would it error or only replace the first 2 ?
Yes, its the number of replacements to make. If you pass a number greater then the actual frequency of the word it will just replace them all.
This is a much more intuitive way to do this, and works with variables much better.
The syntax with the square brackets is not intuitive for me. Could someone point me to the documentation.
@MauiMuc [Type] in front of a variable definition applies a type constraint. It restricts what kind of data can be assigned to the variable. If the value on the right-hand-side can be converted to the type, then the conversion is applied, in this case String to Regex. See this answer for details.
11

You could capture everything before and behind and replace it:

'My name is Bob, her name is Sara.' -replace '(.*?)name(.*)', '$1baby$2'

2 Comments

Wow that worked great. I think I was close to that I tried some examples like that with $1 and $2 but couldn't get it to work properly. Thanks for the help. I didn't fully understand how the examples work but this makes a lot of sense now.
Nice! Using the anchor ^ for the start of the string, the 2nd capture group could be omitted: 'My name is Bob, her name is Sara.' -replace '^(.*?)name', '$1baby'. See regex101 demo

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.