Regexp для сохранения соответствия шаблона в переменную - PullRequest
0 голосов
/ 29 августа 2018

что не так с кодом ниже

    if {[regexp "pattern" $line]} {
    set match [lindex $line 1]
         } else {
     set match 0 }

Я пытаюсь найти шаблон (вместе с другими шаблонами) в большом файле, который повторяется несколько раз, после того, как шаблон соответствует, я сохраняю переменную 'match', иначе мне нужно напечатать ту же переменную, что и 0, проблема в том случае, если шаблон соответствует, то печатается только одно значение

Например:

line1 v

line2 5

шаблон 10

Я получаю вывод как 0, и если оператора else нет, вывод равен 0, я попытался также использовать lsearch, но вывод такой же

обновление вопроса:
Файл имеет следующий контент -:

Line1: здесь запускается cmd
Строка 2: стартовый список здесь
Строка 3: Конечный список здесь
.
.
.
несколько строк
.
.
.
Line1: обычный cmd здесь
Линия 2: Обычный список здесь
рисунок: 10
Строка 3: Конечный файл здесь

    set x {}
    set y {}
    set z {}

    set f1 [open file r]
    while {![eof $f1} {
    gets $f1 f

    if {[regexp "Line1:" $f]} {
    set x [lindex $f 1]
    }

      if {[regexp "Line3:" $f]} {
      set y [lindex $f 2]
    }

         if {[regexp "pattern:" $f]} {
         set z [lindex $f 1]
         } else {
     set z 0
      }
       puts "$x $y $z"
       }

      close $f1

вывод должен быть:
Стартовый список 0
Обычный файл 10

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

В коде нет ничего явно неправильного

if {[regexp "pattern" $line]} {
    set match [lindex $line 1]
} else {
    set match 0
}

и, если содержимое line равно {pattern 10}, оно действительно устанавливает match в 10.

Но могут быть проблемы в окружающем коде, например, переменная line не обновляется новыми значениями для каждой строки.

Чтобы прочитать и найти каждую строку в файле (для примера "myfile.txt"):

set f [open myfile.txt]
while {[gets $f line] >= 0} {
    if {[regexp "pattern" $line]} {
        set match [lindex $line 1]
    } else {
        set match 0
    }
    if {$match != 0} {
        break
    }
}
close $f

В этом коде после того, как совпадение найдено, из файла больше не читаются строки. Если кто-то хочет найти совпадения из нескольких строк, каждое совпадение можно добавить в список.

Кроме того, если «шаблон» содержит метасимволы регулярных выражений, regexp pattern pattern завершится ошибкой, как в

% set pattern abc
abc
% regexp $pattern $pattern
1
% set pattern ab*c
ab*c
% regexp $pattern $pattern
0
0 голосов
/ 29 августа 2018

Вы проверяли опции regexp -all и, возможно, -inline?

set matches [regexp -all -inline $yourRegEx $line]

Обновление

Как указал Донал, вам нужно обработать вывод regexp -all -inline как список:

set matches [regexp -all -inline $yourRegEx $line]
if {![llength $matches]} {
    set matches 0
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...