Вопрос

Я использую группы, чтобы попытаться сопоставить определенную картину, и не получаю настоящих результатов, которые я ожидаю. Схема интереса заключается в следующем:

([0-9]+(\.[0-9]+)+)

Для строки 1.23, Я получил $1=1.23, а также $2=.23 Что имеет смысл для меня.

Но для строки 1.2.3, Я получил $1=1.2.3 а также $2=.3, где бы я ожидал $2=.2.3, потому что его группа является десятичной точкой и цифрой, повторяется.

Может кто -нибудь объяснить мне, как это работает? Благодарю вас!

Это было полезно?

Решение 2

"Эти переменные соответствия шаблона - скаляры, и, как таковые, содержит только одно значение. Это значение - то, что сопоставлено скобки захвата. последний."

http://blogs.perl.org/users/sirhc/2012/05/repeated-capting-and-parsing.html

В вашем примере, $1 Спички 1.2.3. Анкет Как повторяется шаблон, $2 будет установлен на .2 до финального матча .3

Другие советы

При использовании групп захвата с квантификатором, только последний Повторение захваченного шаблона будет сохранено.

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

\b(\d+)((?:\.\d+)+)\b

Эта регуляция отделяет ведущую целочисленную последовательность от его повторяющихся дробных компонентов.

(Как указано @ysth, пожалуйста, имейте в виду, что \d май Сопоставьте больше персонажей чем вы намерены. Если это так, используйте класс символов [0-9] вместо этого или используйте /a модификатор.)

Вот программа PERL, которая демонстрирует эту регуляцию на примере набора данных. (Также см. живая демонстрация.)

#!/usr/bin/perl -w

use strict;
use warnings;

while (<DATA>) {
    chomp;

    # A - A sequence of digits
    # B - A period and a sequence of digits
    # C - Repeat 'B'.

    if (/\b(\d+)((?:\.\d+)+)\b/) {
#           ^^^     ^^^^^
#            A        B
#                   ^^^^^^^
#                      C

        print "[$1]  [$2]\n";
    }
}

__END__
1.23
123.456
1.2.3
1.22.333.444

Ожидаемый выход:

[1]  [.23]
[123]  [.456]
[3]  [.2.3]
[4]  [.22.333.444]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top