Perl регулярное выражение и нумерация буфера захвата - PullRequest
1 голос
/ 23 июля 2010

У меня есть файл, который содержит сотни строк вида

long long int          FILE_FORMAT_HEADER.file.index              1.4      3

Мне все равно, кроме этих двух чисел в конце: 1.4 и 3.

IЯ использую следующее регулярное выражение:

$line =~ m/.+\s+(\d+(\.\d+)?)\s+(\d+(\.\d+)?)/

Идея состоит в том, чтобы прочитать как можно больше этой строки, а затем сохранить первое число в $ 1, а второе в $ 2.После этого запуска я ожидаю, что $ 1 будет содержать 1,4, а $ 2 - 3, но я не добьюсь большого успеха.Я предполагаю, что мое регулярное выражение искажено.Я смотрел на него и переписывал его некоторое время, но я был бы очень признателен за внешний вид.

Ответы [ 3 ]

4 голосов
/ 23 июля 2010

Захватывает просто отлично, но вы подсчитываете контексты совпадений слева направо на каждом (. Поэтому для вашего примера:

 $1 is "1.4"
 $2 is ".4"
 $3 is "3"
 $4 is ""

Возможно, вы захотите привязать шаблон к концу строки с помощью ...\s*$, но, учитывая ваши заявленные требования, более точное соответствие, как вы (правильно) написали, вероятно, предпочтительнее, чем разделенное пробелами соответствие. Возможно, вам также следует выдать диагностическое сообщение для строки, которая не соответствует, если вы ожидаете, что все строки совпадают.

2 голосов
/ 23 июля 2010

почему вы думаете, что вам нужно регулярное выражение?

while (<>){
 chomp;
 @F=split /\s+/, $_;
 # print last and last 2nd element.
}
2 голосов
/ 23 июля 2010
$line =~ m/(\d+(?:\.\d+)?)\s+(\d+(?:\.\d+)?)\s*$/

(? :) не захватывает.

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