Регулярное выражение для поиска строки в буфере Expect - PullRequest
1 голос
/ 05 января 2010

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

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

\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?

Ответы [ 2 ]

1 голос
/ 05 января 2010

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

[0-9]{6}

Обновление с новой информацией

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

\r\n\u001B\[1;14H(X[0-9]{5})
0 голосов
/ 06 января 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 , поэтому, если что-то из этого не имеет смысла, или если у вас есть какие-то идеи по поводу флагов взаимодействия, пожалуйста, поставьте меня прямо.

...