Используйте strings.Index , чтобы найти @
и срез, чтобы получить две части:
var part1, part2 string
if i := strings.Index(s, "@"); i >= 0 {
part1, part2 = s[:i], s[i:]
} else {
// handle case with no @
}
Запустите его на детской площадке . [115 ]
Неэффективный однострочный способ
perl -0777 -pe 's/<.*?>//gs'
так же, как и программа
local $/;
my $text = <>;
s/<.*?>//gs;
print $text;
Зависит от того, какой большой текст вы хотите конвертировать, здесь более эффективно, строка за строкой
perl -pe 'if ($a) {(s/.*?>// and do {s/<.*?>//g; $a = s/<.*//s;1}) or $_=q{}} else {s/<.*?>//g; $a = s/<.*//s}'
аналогична программе
my $a;
while (<>) {
if ($a) {
if (s/.*?>//) {
s/<.*?>//g;
$a = s/<.*//s;
}
else { $_ = q{} }
}
else {
s/<.*?>//g;
$a = s/<.*//s;
}
print;
}
Вы можете проверить модуль Perl Text :: Balanced , часть ядра распределение. Я думаю, что это поможет вам. Как правило, нужно избегать регулярных выражений, чтобы делать подобные вещи, если в предметном тексте, скорее всего, есть внутренний набор разделителей, он может стать очень запутанным.
В Perl:
#! /usr/bin/perl
use strict;
my $text = <>;
$text =~ s/<[^>]*>//g;
print $text;
Регулярное выражение заменяет все, начиная с <до первого> (включительно), и заменяет его ни с чем. G является глобальным (более одного раза).
РЕДАКТИРОВАТЬ: включены комментарии от Hynek и хаос