2013-12-17 3 views
-2

Привет Я новичок в perl и пытаюсь написать регулярное выражение, чтобы найти соответствие для определенного диапазона чисел и строк в строке внутри файла, мне нужно найти строки (" Документ имеет 15 строк и 2 столбца ").Perl Regex для сопоставления строк и чисел внутри файла

Я знаю, что я что-то не хватает, но код, который я пытался до сих пор:

if(/^[a-zA-Z\d]+(has\s[1-9][0-9]$)\srows.*columns/) 
{ 
print "$_\n"; 
} 

Было бы очень полезно, если бы кто-нибудь, дайте мне знать, что здесь не так!

+0

Вы пытаетесь соответствовать слово «документ», или делает Документ представляет собой некоторое имя файла? –

+0

Документ - это просто слово, а не имя файла, также мне нужно просто искать слова «строки» и «столбцы». – Sri

ответ

2

Easy регулярное выражение для использования:

/Document has [0-9]+ row(s?) and [0-9]+ column(s?)/ 

Если s используется только тогда, когда есть больше чем одна строка/столбец

+0

Спасибо! этот код работал, еще одна вещь, как я могу проверить для строк> 1000 здесь? – Sri

+0

Выражение соответствует числу цифр, которые есть. Четыре или пять нигде не приближаются к любому применимому пределу. – tripleee

+0

@Sri Для этого вам нужно будет использовать выражение, которое «фиксирует» количество упомянутых строк и столбцов. Два других ответа, приведенные здесь, иллюстрируют, как это сделать. –

1

Я предполагаю, что вы хотите, чтобы захватить номера.

if (/^Document has (\d+) rows and (\d+) columns/) { 
    my $rows = $1; 
    my $cols = $2; 
+0

Хотя это не большая проблема, но '\ d', поддерживает локаль, насколько я помню, и включает также нелатинские цифры, но я могу ошибаться – nrathaus

+0

@nrathaus: как это вообще проблема? – tripleee

+0

1) '\ d' медленнее, 2) там могут быть не цифры, которые он будет захватывать - в любом случае я сказал, что это НЕ большая проблема. – nrathaus

1
my $line = "Document has 15 rows and 2 columns" 

if ($line =~ /^Document has (\d+) rows? and (\d+) columns?/) 
{ 
    print "rows = $1\n"; 
    print "cols = $2\n"; 
} 
0

Если вы просто хотите, количество строк, используйте:

if (/(\d+)\s+rows/) { 
    print "$1\n"; 
} 

Если вы хотите строки и столбцы (и они всегда в таком порядке), используйте:

if (/(\d+)\s+rows\s+and\s+(\d+)\s+columns/) { 
    print "$1 rows and $2 columns\n"; 
} 

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

Кроме того, я предполагаю, что вы либо используете «-n» в командной строке, либо имеете цикл вокруг этого.

3

Другие ответы здесь хороши, но объяснить, что случилось с регулярным выражением вы использовали:

if(/^[a-zA-Z\d]+(has\s[1-9][0-9]$)\srows.*columns/) 

Первая проблема: выражение не определяет каких-либо пробелов между началом строки и слова has , поэтому нет возможности для этого шаблона соответствовать пространству в Document has...

Вторая проблема: символ $ в регулярном выражении означает «соответствовать, если строка заканчивается здесь». Почти всегда ошибка заключается в использовании якоря $ в середине регулярного выражения; единственный путь этот матч будет будет в многострочный строки как

Documenthas 15 
rows and 7 columns 

внесении эти два изменения в вашем выражении делает его работу:

if(/^[a-zA-Z\d]+\s(has\s[1-9][0-9])\srows.*columns/) 
{ 
print "$_\n"; 
} 
Смежные вопросы