Scanning a String

B

basi

Hello,
How do I scan a string for a pattern and process it when found? For
example:

for all occurrences of two vowel letters in succession, insert the
apostrophe between the vowels.

Thus:

breakground > bre'akgro'und

thank you for your help!
basi
 
N

Nicholas Seckar

Hello,
How do I scan a string for a pattern and process it when found? For
example:

for all occurrences of two vowel letters in succession, insert the
apostrophe between the vowels.

some_string.gsub(/([aeiou])([aeiou])/) {|match| $1 + "'" + $2}
 
D

David A. Black

Hi --

Hello,
How do I scan a string for a pattern and process it when found? For
example:

for all occurrences of two vowel letters in succession, insert the
apostrophe between the vowels.

some_string.gsub(/([aeiou])([aeiou])/) {|match| $1 + "'" + $2}

(You don't really need the block arg (match) :)

Just to add a possible variant: depending how you want to handle three
or more vowels in a row, you might want to do:

pious".gsub(/([aeiou])(?=[aeiou])/) { "#{$1}'#{$2}" }

which will result in: pi'o'us

(I thought there was a [[:vowel:]] POSIX character class but
apparently not.)


David
 
B

basi

David,
Yes, three vowels in a row should be handled as you indicated.
Thank you, and to Nicholas Seckar as well, for the quick reply.

I think I should finally bite the bullet and learn regex.

Basi
 
N

Nicholas Seckar

(You don't really need the block arg (match) :)

Good point :)
pious".gsub(/([aeiou])(?=[aeiou])/) { "#{$1}'#{$2}" }

We could also do away with the block altogether and use
"pious".gsub(/([aeiou])(?=[aeiou])/, '\1\'\2')

Although I don't know if one approach is preferred to the other.
 
R

Robert Klemme

Nicholas Seckar said:
(You don't really need the block arg (match) :)

Good point :)
pious".gsub(/([aeiou])(?=[aeiou])/) { "#{$1}'#{$2}" }

We could also do away with the block altogether and use
"pious".gsub(/([aeiou])(?=[aeiou])/, '\1\'\2')

Although I don't know if one approach is preferred to the other.

Yes, it's preferred because it's faster. Although your variant works, I
usually prefer to put the correct number of backslashes in there:

"pious".gsub(/([aeiou])(?=[aeiou])/, '\\1\'\\2')

Kind regards

robert
 
D

David A. Black

Just to add a possible variant: depending how you want to handle three
or more vowels in a row, you might want to do:

pious".gsub(/([aeiou])(?=[aeiou])/) { "#{$1}'#{$2}" }

which will result in: pi'o'us

I managed to omit the " before pious... and also, I didn't actually
need #{$2} in there. In fact, $2 is nil (because ?= isn't captured).
So....

"pious".gsub(/([aeiou])(?=[aeiou])/) { "#{$1}'" }


David
 
D

David A. Black

Hi --

Nicholas Seckar said:
(You don't really need the block arg (match) :)

Good point :)
pious".gsub(/([aeiou])(?=[aeiou])/) { "#{$1}'#{$2}" }

We could also do away with the block altogether and use
"pious".gsub(/([aeiou])(?=[aeiou])/, '\1\'\2')

Although I don't know if one approach is preferred to the other.

Yes, it's preferred because it's faster. Although your variant works, I
usually prefer to put the correct number of backslashes in there:

"pious".gsub(/([aeiou])(?=[aeiou])/, '\\1\'\\2')

Why do you consider that more correct?


David
 
R

Robert Klemme

David A. Black said:
Hi --

Nicholas Seckar said:
(You don't really need the block arg (match) :)

Good point :)

pious".gsub(/([aeiou])(?=[aeiou])/) { "#{$1}'#{$2}" }

We could also do away with the block altogether and use
"pious".gsub(/([aeiou])(?=[aeiou])/, '\1\'\2')

Although I don't know if one approach is preferred to the other.

Yes, it's preferred because it's faster. Although your variant works, I
usually prefer to put the correct number of backslashes in there:

"pious".gsub(/([aeiou])(?=[aeiou])/, '\\1\'\\2')

Why do you consider that more correct?

Although both produce the same:
"\\1"
=> nil"\\1"
=> nil

because Ruby is so kind to take "\1" literally (i.e not using the
backslash as escaping char because "\1" is not an escaping sequence). I
prefer to explicitely escape the backslash and put the "1" in there
literally. IMHO it's more fail safe when changes are done (especially
when changing single quotes to double quotes, see below).

Consider also
"\n"
=> nil"\\n"
=> nil
"\001"
=> nil"\\1"
=> nil

Might be overly cautious but this is the kind of error that bites you and
if you're not lucky it can take quite some time to figure what's going on
here.

Kind regards

robert
 
D

David A. Black

Hi --

David A. Black said:
Hi --

Yes, it's preferred because it's faster. Although your variant works, I
usually prefer to put the correct number of backslashes in there:

"pious".gsub(/([aeiou])(?=[aeiou])/, '\\1\'\\2')

Why do you consider that more correct?

Although both produce the same:
"\\1"
=> nil"\\1"
=> nil

because Ruby is so kind to take "\1" literally (i.e not using the
backslash as escaping char because "\1" is not an escaping sequence). I
prefer to explicitely escape the backslash and put the "1" in there
literally. IMHO it's more fail safe when changes are done (especially
when changing single quotes to double quotes, see below).

If you're talking about double quotes then clearly it has to be "\\1".
I meant specifically in the case of single quotes. Anyway, it's not a
big deal -- I was just curious.



David
 
R

Robert Klemme

David A. Black said:
Hi --

David A. Black said:
Hi --

On Thu, 28 Apr 2005, Robert Klemme wrote:
Yes, it's preferred because it's faster. Although your variant
works,
I
usually prefer to put the correct number of backslashes in there:

"pious".gsub(/([aeiou])(?=[aeiou])/, '\\1\'\\2')

Why do you consider that more correct?

Although both produce the same:
"\\1"
=> nil
"\\1"
=> nil

because Ruby is so kind to take "\1" literally (i.e not using the
backslash as escaping char because "\1" is not an escaping sequence). I
prefer to explicitely escape the backslash and put the "1" in there
literally. IMHO it's more fail safe when changes are done (especially
when changing single quotes to double quotes, see below).

If you're talking about double quotes then clearly it has to be "\\1".
I meant specifically in the case of single quotes.

Well, yes. But quotes don't necessarily stay single through the course of
a software's lifecycle - with all this dating and matching around... :)
Sorry, drifting off-topic.
Anyway, it's not a
big deal -- I was just curious.

Thought so. I hope I could satisfy your curiosity. :)

Kind regards

robert
 
S

Saynatkari

Le 28/4/2005 said:
Nicholas Seckar said:
(You don't really need the block arg (match) :)

Good point :)
pious".gsub(/([aeiou])(?=[aeiou])/) { "#{$1}'#{$2}" }

We could also do away with the block altogether and use
"pious".gsub(/([aeiou])(?=[aeiou])/, '\1\'\2')

Although I don't know if one approach is preferred to the other.

Yes, it's preferred because it's faster. Although your variant works, I
usually prefer to put the correct number of backslashes in there:

"pious".gsub(/([aeiou])(?=[aeiou])/, '\\1\'\\2')

Single quotes, herr Klemme! '\1\'\2' works fine.
Kind regards

robert

E
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top