Perl Regex для удаления запятых между кавычками?
Я пытаюсь удалить запятые между двойными кавычками в строке, оставляя другие запятыми нетронутыми? (Это адрес электронной почты, который иногда содержит запятые). Следующий код "грубой силы" работает нормально на моей конкретной машине, но есть ли более элегантный способ сделать это, возможно, с помощью одного регулярного выражения? Дункан
$string = '06/14/2015,19:13:51,"Mrs, Nkoli,,,ka N,ebedo,,m" <ubabankoffice93@gmail.com>,1,2';
print "Initial string = ", $string, "<br>\n";
# Extract stuff between the quotes
$string =~ /\"(.*?)\"/;
$name = $1;
print "name = ", $1, "<br>\n";
# Delete all commas between the quotes
$name =~ s/,//g;
print "name minus commas = ", $name, "<br>\n";
# Put the modified name back between the quotes
$string =~ s/\"(.*?)\"/\"$name\"/;
print "new string = ", $string, "<br>\n";
2 ответа
Вы можете использовать этот тип шаблона:
$string =~ s/(?:\G(?!\A)|[^"]*")[^",]*\K(?:,|"(*SKIP)(*FAIL))//g;
детали шаблона:
(?: # two possible beginnings:
\G(?!\A) # contiguous to the previous match
| # OR
[^"]*" # all characters until an opening quote
)
[^",]* #"# all that is not a quote or a comma
\K # discard all previous characters from the match result
(?: # two possible cases:
, # a comma is found, so it will be replaced
| # OR
"(*SKIP)(*FAIL) #"# when the closing quote is reached, make the pattern fail
# and force the regex engine to not retry previous positions.
)
Если вы используете более старую версию Perl, \K
и глаголы контроля возврата могут не поддерживаться. В этом случае вы можете использовать этот шаблон с группами захвата:
$string =~ s/((?:\G(?!\A)|[^"]*")[^",]*)(?:,|("[^"]*(?:"|\z)))/$1$2/g;
Одним из способов было бы использовать хороший модуль Text::ParseWords
выделить конкретное поле и выполнить простую транслитерацию, чтобы избавиться от запятых:
use strict;
use warnings;
use Text::ParseWords;
my $str = '06/14/2015,19:13:51,"Mrs, Nkoli,,,ka N,ebedo,,m" <ubabankoffice93@gmail.com>,1,2';
my @row = quotewords(',', 1, $str);
$row[2] =~ tr/,//d;
print join ",", @row;
Выход:
06/14/2015,19:13:51,"Mrs Nkolika Nebedom" <ubabankoffice93@gmail.com>,1,2
Я предполагаю, что никакие запятые не могут появляться в вашем почтовом поле на законных основаниях. В противном случае требуется другой способ замены.