Я пытался случайное регулярное выражение: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
.
Вы используете свое первое регулярное выражение в качестве первого параметра для 'split'. Вы не делаете этого в своем втором примере. Вы сравниваете яблоки и апельсины. – innaM
Технически «split» выглядит не для разделителей (которые окружают вещи), а для разделителей (которые находятся между ними). В скобках оператор * делится * открытым и закрытым parens, список, подобный этому, разделяется запятой *, а предложение - период - * завершается *. Как ни странно, я не знаю, как это называется, когда дозорный приходит впереди чего-то, как заканчивается терминатор. – tchrist
@innaM У меня только «разделение». На что вы ссылаетесь на «второй пример»? Вероятно, вы имеете в виду '$ string = ~/([\ da-z] +) ([:;]) \ 1 \ 2 \ 1 /;' Когда 'split' не работал так, как я ожидал, я попытался напечатать, что perl интерпретирует мое регулярное выражение. Это все. – GrSrv