views:

441

answers:

2

I'm trying to find a regex that works to match a string of escape characters (an Expect response, see this question) and a six digit number (with alpha-numeric first character).

Here's the whole string I need to identify:

\r\n\u001b[1;14HX76196

Ultimately I need to extract the string:

X76196 

Here's what I have already:

interact {
        #...
        #...
        #this expression does not identify the screen location
        #I need to find "\r\n\u001b[1;14H" AND "([a-zA-Z0-9]{1})[0-9]{5}$"
        #This regex was what I was using before.
        -nobuffer -re {^([a-zA-Z0-9]{1})?[0-9]{5}$} {
                set number $interact_out(0,string)
        }   

I need to identify the escape characters to to verify that it is a field in that screen region. So I need a regex that includes that first portion, but the backslashes are confusing me...

Also once I have the full string in the $number variable, how do I isolate just the number in another variable in Tcl?

+1  A: 

If you just want the number at the end, then this should be enough...

[0-9]{6}

Update with new information

Assuming \n is a newline character, rather than a literal \ followed by a literal n, you can do this...

\r\n\u001B\[1;14H(X[0-9]{5})
rikh
This regex is in an Expect script that searches the response in an SSH session. I need the regex to match the entire string \r\n\u001b[1;14HX76196. The "\r\n\u001b[1;14H" part will always be the same. The "X76196" part will always be a different number.
jjclarkson
I edited my question to define it a little better. There's more to this than just obtaining the number itself.
jjclarkson
I've updated my answer to match. The brackets will let you get just the Xxxxxx part of the string from the rest of it.
rikh
A: 

I found out a few things with some more digging. First of all I wasn't looking at the output of the program but the input of the user. I needed to add the "-o" flag to look at the program output. I also shortened the regex to just the necessary part.

The regex example from @rikh led me to look at why his or my own regex was failing, and that was due to the fact that I wasn't looking at the output but the input. So the original regex that I tried wasn't at fault but the data being looked at (missing the "-o" flag)

Here's the complete answer to my problem.

interact {
#...
    -o -nobuffer -re {(\[1;14H[a-zA-Z0-9]{1})[0-9]{5}} {
            #get number in place
            set numraw $interact_out(0,string)
            #get just number out
            set num [string range $numraw 6 11] 
            #switch to lowercase
            set num [string tolower $num]
            send_user "  stored number: $num"
    }   
}

I'm a noob with Expect and Tcl so if any of this doesn't make sense or if you have any more insights into the interact flags, please set me straight.

jjclarkson