Как я могу удалить все символы из строки, начиная с первого не альфа-символа? - PullRequest
2 голосов
/ 03 февраля 2009

Это было бы намного проще, если бы не определенные ситуации.

Пример данных:

KENP989SD
KENP913E
KENPX189R
KENP913

Какое регулярное выражение можно использовать для удаления всех символов из строки, начинающейся с первого не альфа-символа? По сути, я хочу найти первый не-буквенный символ и отрубить все после него независимо от типа символа.

После применения регулярного выражения эти данные должны быть:

KENP
KENP
KENPX
KENP

Ответы [ 8 ]

14 голосов
/ 03 февраля 2009

$s =~ s/[^a-zA-Z].*$//;

Буквально, найдите первый не альфа-символ и отрежьте все, начиная с него.

6 голосов
/ 03 февраля 2009

Вы сформулировали запрос 2 способами:

  1. Получить все альфа-символы с передней части этих строк
  2. Найдите последний альфа-символ и отрубите все после

Хотя результат такой же, учитывая ваши примерные строки, я обнаружил, что стоит быть более осторожным с регулярными выражениями. Итак, я бы взял первый пункт выше как реальное требование и записал бы его как:

$str =~ s/^([a-z]*)[^a-z].*/$1/i;

Преимущество, на мой взгляд, заключается в том, что неожиданные строки (например, "7KENP989SD") должны приводить к пустой строке после замены, а не к чему-то неожиданному, например "7KENP". Конечно, может быть, это то, что вы хотели ...

5 голосов
/ 03 февраля 2009
s/([A-Za-z]*).*/$1/

... будет работать. Это не обязательно лучший способ сделать это, но в общем случае заменить.

Работает, только если вам нужны буквенные символы

3 голосов
/ 04 февраля 2009

s/\P{Alpha}.*// у меня отлично работает:

perl -pe 's/\P{Alpha}.*//' <<EOF
KENP989SD
KENP913E
KENPX189R
KENP913
EOF
2 голосов
/ 04 февраля 2009

Если вам не нужно изменять саму строку ввода, я использую это немного больше:

my ( $alpha_prefix ) = ( $input_line =~ /^(\p{IsAlpha}*)/ );

Большинство моих переменных - это лексические выражения в подавляющем большинстве случаев, поэтому еще несколько не причиняют вреда и не дают мне возможности исказить вводные данные. Плюс, это проходит заражение .

2 голосов
/ 03 февраля 2009

Вот мой путь.

/ ^ ([A-Za-Z] ). $ /


РЕДАКТИРОВАТЬ Мне больше нравится подход Игоря, чем мой ..


код:

#!/usr/bin/perl
#
# /463375/kak-ya-mogu-udalit-vse-simvoly-iz-stroki-nachinaya-s-pervogo-ne-alfa-simvola
#
use strict;
use warnings;
for my $string (<DATA>){
    $string =~ /^([A-Za-z]*).*$/;
    print "$1\n";
}
__DATA__
KENP989SD
KENP913E
KENPX189R
KENP913
2 голосов
/ 03 февраля 2009

ПРИМЕЧАНИЕ: Я думаю, Игорь более эффективен.

$str =~ s{^([A-Z]+).*}{$1};

Добавить флаг 'i' для нечувствительных к регистру совпадений

$str =~ s{^([A-Z]+).*}{$1}i;
2 голосов
/ 03 февраля 2009

Может быть, это:

s/(?<=^[A-Z]+).*//

Использует средство поиска, чтобы заменить все после начальных альфа-символов на пустые.


При необходимости добавьте флаг i для нечувствительного к регистру:

s/(?<=^[A-Z]+).*//i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...