[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Regex Black Magic... how to stop matching if char?

Jon Fi

3/30/2007 3:34:00 PM

I'm trying to translate a strange derivative of xml into valid xml. Here
is an example line:

<SUBEVENTSTATUS
1:2><OPERATIONNAME></OPERATIONNAME>gofast<OPERATIONSTATUS>stopped</OPERATIONSTATUS><TARGETOBJECTNAME>name</TARGETOBJECTNAME><TARGETOBJECTVALUE>val</TARGETOBJECTVALUE></SUBEVENTSTATUS
1:1><SUBEVENTSTATUS 2:2><......and on

REXML pukes on the <SUBEVENTSTATUS 1:2> tag... which it should. There
should be some kind of attribute declaration instead. I want to
translate it to something like this: <SUBEVENTSTATUS no="1" of="2">

I'm trying to make a regex to detect the funny tags. Here is what I have
so far:

xml_fix=/<(\S+)\s+(\d+):(\d+)>/

This is great, but it will match this:

<Request><code_set_list 1:2>

instead of just this:

<code_set_list 1:2>

...because there is no gauranteed whitespace between tags. Basically, I
need to stop matching if a ">" is found. I've never had to deal with
anything quite like this in my regex experience. Any help or thoughts of
a better way to do things is much appreciated!

--
Posted via http://www.ruby-....

5 Answers

Robert Klemme

3/30/2007 3:39:00 PM

0

On 30.03.2007 17:34, Jon wrote:
> I'm trying to translate a strange derivative of xml into valid xml. Here
> is an example line:
>
> <SUBEVENTSTATUS
> 1:2><OPERATIONNAME></OPERATIONNAME>gofast<OPERATIONSTATUS>stopped</OPERATIONSTATUS><TARGETOBJECTNAME>name</TARGETOBJECTNAME><TARGETOBJECTVALUE>val</TARGETOBJECTVALUE></SUBEVENTSTATUS
> 1:1><SUBEVENTSTATUS 2:2><......and on
>
> REXML pukes on the <SUBEVENTSTATUS 1:2> tag... which it should. There
> should be some kind of attribute declaration instead. I want to
> translate it to something like this: <SUBEVENTSTATUS no="1" of="2">
>
> I'm trying to make a regex to detect the funny tags. Here is what I have
> so far:
>
> xml_fix=/<(\S+)\s+(\d+):(\d+)>/
>
> This is great, but it will match this:
>
> <Request><code_set_list 1:2>
>
> instead of just this:
>
> <code_set_list 1:2>
>
> ..because there is no gauranteed whitespace between tags. Basically, I
> need to stop matching if a ">" is found. I've never had to deal with
> anything quite like this in my regex experience. Any help or thoughts of
> a better way to do things is much appreciated!

I can think of several solutions:

/<([^>\s]+)\s+(\d+):(\d+)>/

Or even a two phased approach

/<[^>]+>/

and then with the match
/(\d+):(\d+)>\z/

HTH

robert

F. Senault

3/30/2007 3:40:00 PM

0

Le 30 mars à 17:34, Jon a écrit :

> ..because there is no gauranteed whitespace between tags. Basically, I
> need to stop matching if a ">" is found. I've never had to deal with
> anything quite like this in my regex experience. Any help or thoughts of
> a better way to do things is much appreciated!

I'd simply use /<[^>]+\s+(\d+):(\d+)>/ (untested, but you get my
drift)...

Fred
--
> Microsoft sucks, sucks, sucks.
Which wouldn't be such a bad thing, if it were cuter, didn't use its
teeth at inopportune moments, didn't hog the bed, cooked well, and had
good taste in films. Sadly, that's not the case. (Dan Birchall, SDM)

Jon Fi

3/30/2007 3:44:00 PM

0

Robert Klemme wrote:
> On 30.03.2007 17:34, Jon wrote:
>>
>>
>> <code_set_list 1:2>
>>
>> ..because there is no gauranteed whitespace between tags. Basically, I
>> need to stop matching if a ">" is found. I've never had to deal with
>> anything quite like this in my regex experience. Any help or thoughts of
>> a better way to do things is much appreciated!
>
> I can think of several solutions:
>
> /<([^>\s]+)\s+(\d+):(\d+)>/
>
> Or even a two phased approach
>
> /<[^>]+>/
>
> and then with the match
> /(\d+):(\d+)>\z/
>
> HTH
>
> robert


awesome, and thank you! but for my benefit, could you explain why that
works? I thought ^ was line start?

--
Posted via http://www.ruby-....

Rob Biedenharn

3/30/2007 4:18:00 PM

0


On Mar 30, 2007, at 11:43 AM, Jon Fi wrote:

> Robert Klemme wrote:
>> On 30.03.2007 17:34, Jon wrote:
>>>
>>>
>>> <code_set_list 1:2>
>>>
>>> ..because there is no gauranteed whitespace between tags.
>>> Basically, I
>>> need to stop matching if a ">" is found. I've never had to deal with
>>> anything quite like this in my regex experience. Any help or
>>> thoughts of
>>> a better way to do things is much appreciated!
>>
>> I can think of several solutions:
>>
>> /<([^>\s]+)\s+(\d+):(\d+)>/
>>
>> Or even a two phased approach
>>
>> /<[^>]+>/
>>
>> and then with the match
>> /(\d+):(\d+)>\z/
>>
>> HTH
>>
>> robert
>
>
> awesome, and thank you! but for my benefit, could you explain why that
> works? I thought ^ was line start?

Within a character set it inverts the selection so [^>] matches any
character that's NOT a '>'

My solution is: .gsub(/<([^>]*?\b\s+)(\d+):(\d+)>/, '<\1no="\2"
of="\3">')

-Rob

Rob Biedenharn http://agileconsult...
Rob@AgileConsultingLLC.com



Brian Candler

3/31/2007 8:33:00 AM

0

On Sat, Mar 31, 2007 at 12:34:25AM +0900, Jon wrote:
> <SUBEVENTSTATUS
> 1:2><OPERATIONNAME></OPERATIONNAME>gofast<OPERATIONSTATUS>stopped</OPERATIONSTATUS><TARGETOBJECTNAME>name</TARGETOBJECTNAME><TARGETOBJECTVALUE>val</TARGETOBJECTVALUE></SUBEVENTSTATUS
> 1:1><SUBEVENTSTATUS 2:2><......and on
>
> REXML pukes on the <SUBEVENTSTATUS 1:2> tag... which it should. There
> should be some kind of attribute declaration instead. I want to
> translate it to something like this: <SUBEVENTSTATUS no="1" of="2">
>
> I'm trying to make a regex to detect the funny tags. Here is what I have
> so far:
>
> xml_fix=/<(\S+)\s+(\d+):(\d+)>/
>
> This is great, but it will match this:
>
> <Request><code_set_list 1:2>
>
> instead of just this:
>
> <code_set_list 1:2>

Try (\w+) instead of (\S+)