# String::gsub catch a group and use it

**URL:** <https://forum.crystal-lang.org/t/string-gsub-catch-a-group-and-use-it/7354>\
**Category:** Help & Support\
**Created:** [October 28, 2024, 7:34pm UTC](https://forum.crystal-lang.org/t/string-gsub-catch-a-group-and-use-it/7354 "2024-10-28T19:34:55Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Fulgurance](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/fulgurance/32/1463_2.png) [@Fulgurance](https://forum.crystal-lang.org/u/Fulgurance)\
**Post date:** [October 28, 2024, 7:34pm UTC](https://forum.crystal-lang.org/t/string-gsub-catch-a-group-and-use-it/7354/1 "2024-10-28T19:34:55Z")

</div>

Hi guys, I try to do something, but like usual, I am not good with regex 🥲

Basically, I would like with a regex to catch all texts starting with a $ (uppercase only or containing as well number), and replace it by ENV[“textvalue”]

Example:

```auto
puts "/usr/bin:$PATH:/usr/share:$NUT".gsub(/(\$)([A-Z0-9])\w+/,"ENV[\"\1\"]")

```

Expected result:  
`/usr/bin:ENV["PATH"]:/usr/share:ENV["NUT"]`

---

<div class="post-metadata">

**Author:** ![Blacksmoke16](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/blacksmoke16/32/1241_2.png) [@Blacksmoke16](https://forum.crystal-lang.org/u/Blacksmoke16)\
**Post date:** [October 28, 2024, 7:38pm UTC](https://forum.crystal-lang.org/t/string-gsub-catch-a-group-and-use-it/7354/2 "2024-10-28T19:38:53Z")

</div>

```crystal
puts "/usr/bin:$PATH:/usr/share:$NUT".gsub(/\$([A-Z0-9]+)/,"ENV[\"\\1\"]")

```

Seems to do the trick.

---

<div class="post-metadata">

**Author:** ![Fulgurance](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/fulgurance/32/1463_2.png) [@Fulgurance](https://forum.crystal-lang.org/u/Fulgurance)\
**Post date:** [October 28, 2024, 7:41pm UTC](https://forum.crystal-lang.org/t/string-gsub-catch-a-group-and-use-it/7354/3 "2024-10-28T19:41:23Z")

</div>

Thanks a lot !

---

<div class="post-metadata">

**Author:** ![Fulgurance](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/fulgurance/32/1463_2.png) [@Fulgurance](https://forum.crystal-lang.org/u/Fulgurance)\
**Post date:** [October 28, 2024, 7:49pm UTC](https://forum.crystal-lang.org/t/string-gsub-catch-a-group-and-use-it/7354/4 "2024-10-28T19:49:16Z")

</div>

And when the regex catch the environment variable, if I want to replace by the value of that var in the system ?

I tried that but don’t work:

```auto
puts "/usr/bin:$PATH1:/usr/share:$NUT".gsub(/\$([A-Z0-9]+)/,"#{ENV["\\1"]}")

```

---

<div class="post-metadata">

**Author:** ![Blacksmoke16](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/blacksmoke16/32/1241_2.png) [@Blacksmoke16](https://forum.crystal-lang.org/u/Blacksmoke16)\
**Post date:** [October 28, 2024, 8:09pm UTC](https://forum.crystal-lang.org/t/string-gsub-catch-a-group-and-use-it/7354/5 "2024-10-28T20:09:43Z")

</div>

You’d probably want to use the block version of `#gsub` in that case, so you can access the match group for each ENV var:

```crystal
"/usr/bin:$PATH1:/usr/share:$NUT".gsub(/\$([A-Z0-9]+)/) do |_, match|
    ENV[match[1]]
  end

```

---

<div class="post-metadata">

**Author:** ![Fulgurance](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/fulgurance/32/1463_2.png) [@Fulgurance](https://forum.crystal-lang.org/u/Fulgurance)\
**Post date:** [October 28, 2024, 9:51pm UTC](https://forum.crystal-lang.org/t/string-gsub-catch-a-group-and-use-it/7354/6 "2024-10-28T21:51:01Z")

</div>

Thanks a lot. It’s exactly what I need

---

<div class="post-metadata">

**Author:** ![bitmand](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/bitmand/32/2514_2.png) [@bitmand](https://forum.crystal-lang.org/u/bitmand)\
**Post date:** [November 1, 2024, 7:45am UTC](https://forum.crystal-lang.org/t/string-gsub-catch-a-group-and-use-it/7354/7 "2024-11-01T07:45:56Z")

</div>

Just want to mention: [https://rubular.com](https://rubular.com) :)

It’s been my goto website for building and testing regular expressions, ever since I was introduced to Ruby back in 2009.

---

<div class="post-metadata">

**Author:** ![Blacksmoke16](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/blacksmoke16/32/1241_2.png) [@Blacksmoke16](https://forum.crystal-lang.org/u/Blacksmoke16)\
**Post date:** [November 1, 2024, 1:14pm UTC](https://forum.crystal-lang.org/t/string-gsub-catch-a-group-and-use-it/7354/8 "2024-11-01T13:14:43Z")

</div>

Crystal uses a different Regex engine than Ruby, so it might not be the best option for testing Crystal regexes. I usually use [https://regexr.com/](https://regexr.com/), but be sure to change the engine to `PCRE` instead of `Javascript` as it defaults to towards the top right.
