Perl Регулярное выражение для соответствия строке содержит буквы / цифры / точку - PullRequest
2 голосов
/ 10 января 2020

Я пытаюсь сопоставить строку, которая содержит alphanumeri c, цифры и точки.

  • Начинается с алфавитов [az | AZ], за которыми следуют цифры, разделенные точкой между [1.2. 3.5] и заканчивается только di git.

Некоторые примеры того, что я пытаюсь сопоставить:

my @patternsTomatch = (
 'SAN100.25.36.2',   # Valid string 
, 'DF1.2.3.5',       # Valid string
, 'BADPATTERN',      # In-Valid string
, '12BADPATTERN',    # In-Valid string
, '.DF1.2.3.5',       # In-Valid string
, 'SAN100.25.36.2.'  # In-Valid string
);

foreach my $pattern (@patternsTomatch) {
   if ( $pattern =~ /^([a-z|A-Z]+)(\d+\.)(.*)$/ ) { print " $pattern \n"; }
}

Но приведенная выше попытка не работает правильно?

Также необходимо регулярное выражение для соответствия строке фиксированного формата XC1.2.3.4_25 в состоянии разделения.

  • Начинается с алфавитов [az | AZ], за которыми следуют цифры, разделенные точкой в промежутке между [1.2.3.5], за которым следует только одно подчеркивание и заканчивается только di git.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 10 января 2020

Вы можете сначала сопоставить 1+ символов [A-Za-z]+ (обратите внимание, что вам не нужен канал в классе символов), а затем повторить совпадающие цифры с точкой между:

^[A-Za-z]+\d+(?:\.\d+)+$

regex demo


Чтобы соответствовать подчеркиванию и цифрам в конце, вы можете добавить соответствующие подчеркивание и 1+ цифр в конце шаблона перед утверждением конца строки:

^[A-Za-z]+\d+(?:\.\d+)+_\d+$

Regex demo

2 голосов
/ 10 января 2020

Я думаю, вы хотите что-то еще, как это:

my @candidates = (
  'SAN100.25.36.2',   # Valid string
  'DF1.2.3.5',        # Valid string
  'BADPATTERN',       # In-Valid string
  '12BADPATTERN',     # In-Valid string
  '.DF1.2.3.5',       # In-Valid string
  'SAN100.25.36.2.'   # In-Valid string
);

# store the pattern in a variable to get it out of the way 
# of the logic
my $pattern = qr/
    \A          # beginning of string
    [a-z]+      # latin letters, case insensitive
    \d+         # digits
    (?:         # groups of . and digits
        \.
        \d+
    )+
    (?:         # optional _ digits at end (or leave this group out)
        _
        \d+
    )?
    \z          # end of string
    /ix;        # /i - case insenstive  /x - expanded format

foreach my $candidate ( @candidates ) {
   if( $candidate =~ $pattern ) {
     print "$candidate matched\n";
     }
   else {
     print "$candidate missed\n";
     }
}
0 голосов
/ 11 января 2020

Сделан код максимально простым

use strict;
use warnings;

use feature 'say';

my @match = grep { chomp; /^[a-z]+\d+(:?\.\d+)+(:?_\d+)?$/i } <DATA>;

map{ say } @match;

__DATA__
SAN100.25.36.2
DF1.2.3.5
BADPATTERN
12BADPATTERN
.DF1.2.3.5
SAN100.25.36.2.
XC1.2.3.4_25

вывод

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