Как убедиться, что мое регулярное выражение не слишком подходит - PullRequest
0 голосов
/ 18 августа 2011

В файле есть несколько слов с цифрами в начале.я хочу извлечь конкретную строку без строки. Когда дано 1, он извлекает строку 1 также с 11, 21

FILE.txt имеет содержимое:

1.sample
lines of
2.sentences
present in
...
...
10.the 
11.file

когда Выполнено pro 1 file.txt дает результатыиз строки 1,10, а также из строки 11, поскольку эти три результата имеют 1 в своей строке.т.е.

Вывод сценария:

1.sample
10.the 
11.file

Ожидаемый вывод: ожидаемый вывод - это только содержимое строки 1, а не содержимое строки 10 или строки 11.т.е.

Ожидаемый результат:

1.sample

Мой текущий код:

proc pro { pattern args} {

   set file [open $args r]
   set lnum 0
   set occ 0 
   while {[gets $file line] >=0} {
      incr lnum
      if {[regexp $pattern $line]} {
          incr occ
          puts "The pattern is present in line: $lnum" 
          puts "$line"
      } else {
         puts "not found"
      }
   }
   puts "total number of occurencese : $occ"
   close $file
}

программа работает нормально, но дело в том, что я получаю строки, которые я не хочувместе с ожидаемой линией.Поскольку число (1), которое я хочу получить, присутствует в других строках, таких как 11, 21, 14 и т. Д., Эти строки также печатаются.

будьте добры терпеть мой неясный способ объяснения вопроса.

Ответы [ 3 ]

1 голос
/ 18 августа 2011

Вы можете решить проблему, используя границы слов, как предлагает glen, но вы также можете рассмотреть следующие вещи:

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

regexp "^$lineNo\\." $a

Я бы также предложил использовать ^ (совпадение в начале строки), чтобы даже если число присутствовало в строке в другом месте, оно не учитывалось.

Границы слов tcl хорошо объяснены в http://www.regular -expressions.info / wordboundaries.html

0 голосов
/ 18 августа 2011

Если то, что вы хотите сделать, так же ограничено, как и то, что вы описываете, почему бы просто не использовать что-то вроде

if { [string range $line 0 [string length $pattern]] eq "${pattern}." } {
    ...
}
0 голосов
/ 18 августа 2011

Вы должны убедиться, что ваш шаблон соответствует только границам слов:

if {[regexp "\\m$pattern\\M" $line]} { ...

См. Документацию для синтаксиса регулярных выражений .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...