Я думаю, это то, что вы считаете классом персонажей. По некоторым причинам это компилируется, но выходные данные отладки показывают кое-что любопытное, когда я изолировал класс символов.
use strict;
use warnings;
use re 'debug';
my $re = qr/[[a-zA-Z0-9]\-\.]/;
И вывод дебюта (от use re 'debug'
) показывает это:
Compiling REx "[[a-zA-Z0-9]\-\.]"
Final program:
1: ANYOF[0-9A-[a-z][] (12)
12: EXACT <-.]> (14)
14: END (0)
anchored "-.]" at 1 (checking anchored) stclass ANYOF[0-9A-[a-z][] minlen 4
Итак, он ищет литерал строку '-.]'
в качестве "якоря" . Таким образом, если ваше имя хоста не содержит '.-]
, оно никогда не будет совпадать. Таким образом, как я уже говорил ранее, вы закрываете свой класс персонажа первым не-экранированным ']'
.
Лучший способ добавить тире - сделать его последним символом в классе, чтобы исключить возможность указания диапазона.
Кроме того, все это должен быть только один класс. Вы на самом деле закрываете класс первым закрывающимся квадратным скобком. Ваш класс персонажа должен читать:
[a-zA-Z0-9.-]
И это все.
Кроме того, возможно, лучше использовать классы именованных символов:
[\p{IsAlnum}.-]
- Еще одна интересная вещь, которую я обнаружил, заключается в том, что в
']'
интерпретируется как литерал квадратное закрытие, где класс символов не открыт. Таким образом, вам нужно только избежать его, чтобы избежать окончания класса символов и, следовательно, включить его. И наоборот, '[['
будет включать '['
в класс символов, поэтому нет смысла избегать '['
, если только вне класса символов.