Регулярное выражение для поиска строки в буфере ожидания

Я пытаюсь найти регулярное выражение, которое соответствует строке escape-символов (ответ Expect, см. этот вопрос) и шестизначное число (с буквенно-цифровым первым символом).

Вот вся строка, которую мне нужно идентифицировать:

\r\n\u001b[1;14HX76196

В конечном итоге мне нужно извлечь строку:

X76196 

Вот что у меня уже есть:

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)
        }   

Мне нужно идентифицировать escape-символы, чтобы убедиться, что это поле в этой области экрана. Итак, мне нужно регулярное выражение, которое включает эту первую часть, но обратная косая черта меня смущает...

Кроме того, когда у меня есть полная строка в переменной $number, как мне выделить только число в другой переменной в Tcl?


person jjclarkson    schedule 05.01.2010    source источник


Ответы (2)


Если вам просто нужен номер в конце, то этого должно быть достаточно...

[0-9]{6}

Добавить новую информацию

Предполагая, что \n является символом новой строки, а не литералом \, за которым следует литерал n, вы можете сделать это...

\r\n\u001B\[1;14H(X[0-9]{5})
person Rik Heywood    schedule 05.01.2010
comment
Это регулярное выражение находится в сценарии Expect, который ищет ответ в сеансе SSH. Мне нужно, чтобы регулярное выражение соответствовало всей строке \r\nX76196. Часть \r\n[1;14H] всегда будет одинаковой. Часть X76196 всегда будет иметь другой номер. - person jjclarkson; 05.01.2010
comment
Я отредактировал свой вопрос, чтобы определить его немного лучше. Это больше, чем просто получение самого номера. - person jjclarkson; 05.01.2010
comment
Я обновил свой ответ, чтобы он соответствовал. Скобки позволят вам получить только часть Xxxxxx строки из остальной ее части. - person Rik Heywood; 05.01.2010

Я узнал несколько вещей, покопавшись еще немного. Прежде всего, я смотрел не на вывод программы, а на ввод пользователя. Мне нужно было добавить флаг «-o», чтобы посмотреть вывод программы. Я также сократил регулярное выражение до необходимой части.

Пример регулярного выражения от @rikh заставил меня задуматься, почему его или мое собственное регулярное выражение терпело неудачу, и это было связано с тем, что я смотрел не на вывод, а на ввод. Таким образом, исходное регулярное выражение, которое я пробовал, было не ошибкой, а просматриваемыми данными (отсутствует флаг «-o»)

Вот полный ответ на мою проблему.

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"
    }   
}

Я новичок в Expect и Tcl, поэтому, если что-то из этого не имеет смысла или у вас есть дополнительные сведения о флагах взаимодействия, поправьте меня.

person jjclarkson    schedule 06.01.2010