# Reg exp

**URL:** <https://www.ruby-forum.com/t/reg-exp/154803>\
**Category:** Ruby\
**Created:** [December 4, 2008, 3:40am UTC](https://www.ruby-forum.com/t/reg-exp/154803 "2008-12-04T03:40:31Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![hai\_l](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/c68b51/32.png) [@hai\_l](https://www.ruby-forum.com/u/hai_l)\
**Post date:** [December 4, 2008, 3:40am UTC](https://www.ruby-forum.com/t/reg-exp/154803/1 "2008-12-04T03:40:31Z")

</div>

I have a problem with regexp. I have some document like :

A method for detecting a post-translationally modified protein with a  
glycosyl group comprising contacting the protein with a glycosyl  
transferase enzyme and a labeling agent, wherein the labeling agent  
comprises a chemical handle and a transferable glycosyl group.

I want to divide it to some string follow a rule that string start with  
“a, an, the” like :

"A method for detecting "  
"a post-translationally modified protein with "  
"a glycosyl group comprising contacting "  
"the protein with "  
"a glycosyl transferase enzyme and "  
"a labeling agent, wherein "  
"the labeling agent comprises "  
"a chemical handle and "  
“a transferable glycosyl group.”

I use the code

while element.size do  
if element =~ /([Aa]|[Aa]n|[Tt]he)( [^]+)(?:[Aa]|[Aa]n|[Tt]he)?/  
then  
temp\_string = $1 +$2  
temp\_array \<\< temp\_string  
else  
break  
end  
element.slice!(temp\_string)  
end

but it’s not ok. the result is

```
A method
a post-translationally
a glycosyl
the protein
a glycosyl
a labeling
the labeling
a chemical
a transferable

```

Can anyone help me about the code ?

Hai Anh

---

<div class="post-metadata">

**Author:** ![hai\_l](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/c68b51/32.png) [@hai\_l](https://www.ruby-forum.com/u/hai_l)\
**Post date:** [December 4, 2008, 5:08am UTC](https://www.ruby-forum.com/t/reg-exp/154803/2 "2008-12-04T05:08:34Z")

</div>

From: Hai anh Le [[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)]

# while element.size do

# if element =~ /([Aa]|[Aa]n|[Tt]he)( [^]+)(?:[Aa]|[Aa]n|[Tt]he)?/

# then

# temp\_string = $1 +$2

# temp\_array \<\< temp\_string

# else

# break

# end

# element.slice!(temp\_string)

# end

if you like to walk thru the string manually, then stringscanner works  
best.

otoh, you can also try string#split

but my initial reaction was just to find those articles then mark them w  
newlines (maybe because i’m fond of programming w paper and pencil 🙂

eg,

> puts s.gsub(/([Aa]|[Aa]n|[Tt]he)\W+/){“\n”+$1+“\s”}

A method for detecting  
a post-translationally modified protein with  
a glycosyl group comprising contacting  
the protein with  
a glycosyl transferase enzyme and  
a labeling agent, wherein  
the labeling agent comprises  
a chemical handle and  
a transferable glycosyl group.

---

<div class="post-metadata">

**Author:** ![hai\_l](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/c68b51/32.png) [@hai\_l](https://www.ruby-forum.com/u/hai_l)\
**Post date:** [December 4, 2008, 7:19pm UTC](https://www.ruby-forum.com/t/reg-exp/154803/3 "2008-12-04T19:19:13Z")

</div>

On Thu, Dec 4, 2008 at 3:34 AM, Hai anh Le [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> "A method for detecting "  
> "a post-translationally modified protein with "  
> "a glycosyl group comprising contacting "  
> "the protein with "  
> "a glycosyl transferase enzyme and "  
> "a labeling agent, wherein "  
> "the labeling agent comprises "  
> "a chemical handle and "  
> “a transferable glycosyl group.”

I though of split, but then you get an array entry for the “separator”  
and the following part, so you would need to paste them again  
yourself:

irb(main):008:0\> a = “A method for detecting a post-translationally  
modified protein with a glycosyl group comprising contacting the  
protein with a glycosyl transferase enzyme and a labeling agent,  
wherein the labeling agent comprises a chemical handle and a  
transferable glycosyl group.”  
=\> “A method for detecting a post-translationally modified protein  
with a glycosyl group comprising contacting the protein with a  
glycosyl transferase enzyme and a labeling agent, wherein the labeling  
agent comprises a chemical handle and a transferable glycosyl group.”  
irb(main):011:0\> require ‘enumerator’  
=\> true  
irb(main):012:0\> result = []  
=\> []  
irb(main):015:0\> a.split(/\b(a|an|the)\b/i)[1…-1].each\_slice(2) {|a,  
b| result \<\< (a+b)}  
=\> nil  
irb(main):016:0\> result  
=\> ["A method for detecting ", "a post-translationally modified  
protein with ", "a glycosyl group comprising contacting ", "the  
protein with ", "a glycosyl transferase enzyme and ", "a labeling  
agent, wherein ", "the labeling agent comprises ", "a chemical handle  
and ", “a transferable glycosyl group.”]

Maybe someone can come with a split solution easier to join?

Hope this helps,

Jesus.

---

<div class="post-metadata">

**Author:** ![hai\_l](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/c68b51/32.png) [@hai\_l](https://www.ruby-forum.com/u/hai_l)\
**Post date:** [December 4, 2008, 7:28am UTC](https://www.ruby-forum.com/t/reg-exp/154803/4 "2008-12-04T07:28:59Z")

</div>

PeÃ±a, Botp wrote:

> > puts s.gsub(/([Aa]|[Aa]n|[Tt]he)\W+/){"\n"+$1+"\s"}
> 
> A method for detecting  
> a post-translationally modified protein with  
> a glycosyl group comprising contacting  
> the protein with  
> a glycosyl transferase enzyme and  
> a labeling agent, wherein  
> the labeling agent comprises  
> a chemical handle and  
> a transferable glycosyl group.

Thank for your help, this is another way. I think I can use “\n” to  
mark, after that depend on it to divide.

---

<div class="post-metadata">

**Author:** ![hai\_l](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/c68b51/32.png) [@hai\_l](https://www.ruby-forum.com/u/hai_l)\
**Post date:** [December 4, 2008, 8:16pm UTC](https://www.ruby-forum.com/t/reg-exp/154803/5 "2008-12-04T20:16:14Z")

</div>

Hi –

On Fri, 5 Dec 2008, Jesús Gabriel y Galán wrote:

> > 
> 
> I though of split, but then you get an array entry for the “separator”  
> glycosyl transferase enzyme and a labeling agent, wherein the labeling  
> protein with ", "a glycosyl group comprising contacting ", "the  
> protein with ", "a glycosyl transferase enzyme and ", "a labeling  
> agent, wherein ", "the labeling agent comprises ", "a chemical handle  
> and ", “a transferable glycosyl group.”]
> 
> Maybe someone can come with a split solution easier to join?

Try this:

a.split(/(?=an?\b|the\b)/i)

David

---

<div class="post-metadata">

**Author:** ![hai\_l](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/h/c68b51/32.png) [@hai\_l](https://www.ruby-forum.com/u/hai_l)\
**Post date:** [December 4, 2008, 11:13pm UTC](https://www.ruby-forum.com/t/reg-exp/154803/6 "2008-12-04T23:13:55Z")

</div>

On Thu, Dec 4, 2008 at 8:09 PM, David A. Black [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> Try this:
> 
> a.split(/(?=an?\b|the\b)/i)

Neat, thanks. I understand how lookaheads work when it comes to  
matching a regex,  
but it’s still not clear to me why split works with the lookahead.  
Isn’t the match of the lookahead a 0-width string?

irb(main):001:0\> a = “abcxxxabcxxxabcxxx”  
=\> “abcxxxabcxxxabcxxx”  
irb(main):006:0\> a.match(/(?=abc)/)[0]  
=\> “”  
irb(main):007:0\> a =~ /(?=abc)/  
=\> 0

Then, how does split knows where to start the next search?

Thanks,

Jesus.
