Eugen
Eugen

Reputation: 155

gsub same pattern from a string

I have big problems with figuring out how regex works. I want this text:

This is an example\e[213] text\e[123] for demonstration

to become this:

This is an example text for demonstration.

So this means that I want to remove all strings that begin with \e[ and end with ] I just cant find a proper regex for this. My current regex looks like this:

/.*?(\\e\[.*\])?.*/ig

But it dont work. I appreciate every help.

Upvotes: 0

Views: 96

Answers (3)

mraseelak
mraseelak

Reputation: 21

You can make the search less greedy by using .+? in the regex

puts 'This is an example\e[213] text\e[123] for demonstration'.gsub(/\\e\[.+?\]/, '')  
This is an example text for demonstration  
=> nil

Upvotes: 1

Casimir et Hippolyte
Casimir et Hippolyte

Reputation: 89557

You only need to do this:

txt.gsub(/\\e\[[^\]]*\]/i, "")

There is no need to match what is before or after with .*

The second problem is that you use .* to describe the content between brackets. Since the * quantifier is by default greedy, it will match all until the last closing bracket in the same line.

To prevent this behaviour a way is to use a negated character class in place of the dot that excludes the closing square brackets [^\]]. In this way you keep the advantage of using a greedy quantifier.

Upvotes: 3

Matt
Matt

Reputation: 74670

gsub can do the global matching for you.

re = /\\e\[.+?\]/i
'This is an example\e[213] text\e[123] for demonstration'.gsub re, ''
=> "This is an example text for demonstration"   

Upvotes: 2

Related Questions