Perl RegEx, чтобы найти часть адреса электронной почты до @ - PullRequest
2 голосов
/ 26 июля 2010

У меня есть эта проблема в Perl. У меня есть файл, в который я получаю список писем в качестве входных данных.

Я хотел бы проанализировать строку перед '@' всех адресов электронной почты. (Позже я буду хранить всю строку перед @ в массиве)

Например. в: abcdefgh@gmail.com, я хотел бы проанализировать адрес электронной почты и извлечь abcdefgh.

Мое намерение состоит в том, чтобы получить только строку перед '@'. Теперь вопрос в том, как проверить это с помощью регулярного выражения. Или есть какой-либо другой метод, использующий substr?

, хотя я использую регулярное выражение: $ mail = ~ "\ @" в Perl, это не дает мне результата.

Кроме того, как я узнаю, что символ '@' находится в каком индексе строки $ mail?

Я ценю, если кто-нибудь может мне помочь.

#!usr/bin/perl

$mail = "abcdefgh@gmail.com";

if ($mail =~ "\@" ) {
    print("my name = You got it!");
}
else
{
    print("my name = Try again!");
}

В приведенном выше коде $ mail = ~ "\ @" не дает мне желаемый вывод, но ($ mail = ~ "abc") дает.

$ mail = ~ "@" будет работать, только если данная строка $ mail = "abcdefgh \ @ gmail.com";

Но в моем случае я получу ввод с адресом электронной почты в качестве его.

Не с escape-символом.

Спасибо

Tom

Ответы [ 5 ]

6 голосов
/ 26 июля 2010

Включение предупреждений указало бы на вашу проблему:

#!/usr/bin/perl
use warnings;

$mail = "abcdefgh@gmail.com";
__END__
Possible unintended interpolation of @gmail in string at - line 3.
Name "main::gmail" used only once: possible typo at - line 3.

, а включение строгого режима предотвратило бы его компиляцию:

#!/usr/bin/perl
use strict;
use warnings;

my $mail = "abcdefgh@gmail.com";
__END__
Possible unintended interpolation of @gmail in string at - line 4.
Global symbol "@gmail" requires explicit package name at - line 4.
Execution of - aborted due to compilation errors.

Другими словами, ваша проблема не быларегулярное выражение работало или не работало, это было то, что строка, с которой вы сравнивали, содержала "abcdefgh.com", а не то, что вы ожидали.

2 голосов
/ 26 июля 2010

Знак @ является метасимволом в строках в двойных кавычках.Если вы поместите свой адрес электронной почты в одинарные кавычки, у вас не возникнет этой проблемы.

Кроме того, я должен добавить обязательный комментарий, что это хорошо, если вы просто экспериментируете, но в рабочем коде вы не должныанализируйте адреса электронной почты с помощью регулярных выражений, но вместо этого используйте модуль, такой как Mail :: Address .

1 голос
/ 26 июля 2010

Что, если вы попробовали это:

my $email = 'user@email.com';

$email =~ /^(.+?)@/;
print $1

$ 1 будет всем до @.

0 голосов
/ 26 июля 2010
$mail = 'abcdefgh@gmail.com';
$mail =~ /^([^@]*)@/;
print "$1\n"
0 голосов
/ 26 июля 2010

Если вы хотите индекс строки, вы можете использовать функцию index(). то есть.

my $email = 'foo@bar';
my $index = index($email, '@');

Если вы хотите вернуть первую половину письма, я бы использовал split() поверх регулярных выражений.

my $email = 'foo@bar';
my @result = split '@', $email;
my $username = $result[0];

Или еще лучше с substr

my $username = substr($email, 0, index($email, '@'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...