2013-06-24 5 views
3

Я пытался случайное регулярное выражение:Perl Regex вопрос

$string = "sajdk3:jdk3:jdk3:dgklmhij"; 
@arr = split(/([\da-z]+)([:;])\1\2\1/, $string); 

# As per my understanding of RegEx, the given pattern shall match jdk3:jdk3:jdk3 
# So @arr must contain two scalar values: 'sa' and ':dgklmhij' 
# But when I printed @arr I got something else 
print "Array: @arr\nNumber of items: ", scalar @arr; 
#Array: sa jdk3 : :dgklmhij 
#Number of items: 4 

# So, I tried: 
$string =~ /([\da-z]+)([:;])\1\2\1/; 
print "\n($1) ($2)\n"; 
print "($`)($&)($') \n"; 
# (jdk3) (:) () () () 
# (sa)(jdk3:jdk3:jdk3)(:dgklmhij) 

Может кто-то объяснить, почему массив имеет 4 элемента, а не 2?

Хорошо, поэтому после объяснения @mpapec мне любопытно, как это сделать. Что делать, если группа захвата неизбежна в параметре split. Как вы хотите разделить дату, которая может быть 12-05-92 или 26.11.87 или 07 04 92.

+2

Вы используете свое первое регулярное выражение в качестве первого параметра для 'split'. Вы не делаете этого в своем втором примере. Вы сравниваете яблоки и апельсины. – innaM

+0

Технически «split» выглядит не для разделителей (которые окружают вещи), а для разделителей (которые находятся между ними). В скобках оператор * делится * открытым и закрытым parens, список, подобный этому, разделяется запятой *, а предложение - период - * завершается *. Как ни странно, я не знаю, как это называется, когда дозорный приходит впереди чего-то, как заканчивается терминатор. – tchrist

+0

@innaM У меня только «разделение». На что вы ссылаетесь на «второй пример»? Вероятно, вы имеете в виду '$ string = ~/([\ da-z] +) ([:;]) \ 1 \ 2 \ 1 /;' Когда 'split' не работал так, как я ожидал, я попытался напечатать, что perl интерпретирует мое регулярное выражение. Это все. – GrSrv

ответ

3

Может кто-нибудь объяснить, почему массив имеет 4 элемента, а не 2?

Вы захватывая разделители, а когда расщепление, так что есть 4 элемента вместо 2.

От http://perldoc.perl.org/functions/split.html

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

+0

Спасибо @mpapec – GrSrv