Help needed using a regex .sub

I’m trying to insert a NULL between the first pair of commas in the line
below if it’s not already there.

Before: PWCLLP-243-00000002,Images\1\pwcllp_243_00000002.tif,

After: PWCLLP-243-00000002,NULL,Images\1\pwcllp_243_00000002.tif,

I want to replace only the first instance of , on the line with ,NULL,

I can do that with: @record.sub!(’,’,’,NULL,’)

The problem is if the record already has NULL between those 2 commas,
I’d get:

PWCLLP-243-00000002,NULL,Images\1\pwcllp_243_00000002.tif,NULL,

I tried this: @record.sub!(’[[:digit:]],’,’,NULL,’)

I figured that would replace the first instance of a digit followed by 2
commas, but it doesn’t work. I’m assuming my syntax is incorrect, but
I’ve tried all variations I can think of. Anyone out there have any
ideas? I’d be very grateful!
PV

On Nov 22, 2007 6:33 AM, Peter V. [email protected]
wrote:

ideas? I’d be very grateful!
PV

You might want to use a CSV library, like FasterCSV. But if you don’t
want that overhead and really want to use a regex…

When you say the “first instance of ,”, do you really mean “only if
the first comma on the line is immediately followed by another comma”?

@record.sub!(/^([^,]*),/, ‘\1,NULL,’)

That regex is: Start at the beginning of the line, match all the
non-comma characters, followed by 2 commas.
The replacement is: All the non-comma characters, then ‘,NULL,’
instead of the two commas.

-Alex

Alex,
Your solution is exactly what I need, thank you very much! I’m getting
better with regular expressions the more I work with them, and I really
appreciate your explanation of this regex.
PV

Alex LeDonne wrote:

On Nov 22, 2007 6:33 AM, Peter V. [email protected]
wrote:

ideas? I’d be very grateful!
PV

You might want to use a CSV library, like FasterCSV. But if you don’t
want that overhead and really want to use a regex…

When you say the “first instance of ,”, do you really mean “only if
the first comma on the line is immediately followed by another comma”?

@record.sub!(/^([^,]*),/, ‘\1,NULL,’)

That regex is: Start at the beginning of the line, match all the
non-comma characters, followed by 2 commas.
The replacement is: All the non-comma characters, then ‘,NULL,’
instead of the two commas.

-Alex

7stud – wrote:

On my system, this solution is 80% faster, and if your strings get
longer it will be faster still:

first_comma_pos = str.index(’,’)

…and twice as fast with this additional change:

first_comma_pos = str.index(?,)

Peter V. wrote:

Alex,
Your solution is exactly what I need, thank you very much! I’m getting
better with regular expressions the more I work with them, and I really
appreciate your explanation of this regex.
PV

On my system, this solution is 80% faster, and if your strings get
longer it will be faster still:

str = ‘PWCLLP-243-00000002,Images\1\pwcllp_243_00000002.tif,’

first_comma_pos = str.index(’,’)
next_char_pos = first_comma_pos + 1

if str[next_char_pos] == ?,
str.insert(next_char_pos, ‘NULL’)
end

puts str