Существует ли совместимое с Perl регулярное выражение для обрезки пробела с обеих сторон строки?

Вам не нужно запускать команду npm pack, чтобы создать тарбол.

Просто используйте пакет tar:

const tar = require('tar');
const fstream = require('fstream');

function pack({ path, target }) {
  fstream
    .Reader({ path, type: 'Directory' })
    .pipe(tar.Pack({ noProprietary: true }))
    .pipe(fs.createWriteStream(target));
}

const name = 'your-folder-package';

pack({
  path: path.join(__dirname, 'packages', name),
  target: path.join(__dirname, 'dist/packages', `${name}.tar`),
});
11
задан Alan Moore 14 March 2009 в 08:09
поделиться

12 ответов

$x =~ s/^\s+|\s+$//g;

или

s/^\s+//, s/\s+$// for $x;
26
ответ дан 3 December 2019 в 00:38
поделиться

Мой первый вопрос состоит... в том почему? Я не вижу ни одного из единственных-regexp решений быть больше читаемым, чем regexp, с которого Вы запустили. И они уверенный не в какой-либо степени как быстро.

#!/usr/bin/perl

use strict;
use warnings;

use Benchmark qw(:all);

my $a = 'a' x 1_000;

my @x = (
         "    $a   ",
         "$a   ",
         $a,
         "    $a"
        );

cmpthese(-5,
         {
             single => sub {
                 for my $s (@x)
                 {
                     my $x = $s;
                     $x =~ s/^\s+|\s+$//g;
                 }
             },
             double => sub {
                 for my $s (@x)
                 {
                     my $x = $s;
                     $x =~ s/^\s+//;
                     $x =~ s/\s+$//;
                 }
             },
             trick => sub {
                 for my $s (@x)
                 {
                     my $x = $s;
                     s/^\s+//, s/\s+$// for $x;
                 }
             },
             capture => sub {
                 for my $s (@x)
                 {
                     my $x = $s;
                     $x =~ s/\A\s*(.*?)\s*\z/$1/
                 }
             },
             kramercap => sub {
                 for my $s (@x)
                 {
                     my $x = $s;
                     ($x) = $x =~ /^\s*(.*?)\s*$/
                 }
             },
         }
        );

дает результаты на моей машине:

             Rate    single   capture kramercap     trick    double
single     2541/s        --      -12%      -13%      -96%      -96%
capture    2902/s       14%        --       -0%      -95%      -96%
kramercap  2911/s       15%        0%        --      -95%      -96%
trick     60381/s     2276%     1981%     1974%        --       -7%
double    65162/s     2464%     2145%     2138%        8%        --

Править: runrig является правильным, но мало измениться. Я обновил код для копирования строки перед модификацией, которая, конечно, замедляет вещи. Я также принял во внимание brian d предложение foy в другом ответе для использования более длинной строки (хотя миллион походил на излишество). Однако это также предлагает, чтобы перед выбором стиля приема Вы выяснили то, на что Ваши длины строки похожи - преимущества приема уменьшены с более короткими строками. Во всех длинах я протестировал, тем не менее, двойные победы. И это еще легче на глазах.

30
ответ дан 3 December 2019 в 00:38
поделиться

Tanktalus показывает сравнительный тест для очень маленьких строк, но проблемы ухудшаются, поскольку строки становятся больше. В его коде я изменил главную часть:

my $a = 'a' x 1_000_000;

my @x = (
  "   $a   ",
  "$a    ",
  $a,
  "    $a"
  );

Я получаю эти результаты:

          Rate  single capture   trick  double
single  2.09/s      --    -12%    -98%    -98%
capture 2.37/s     13%      --    -98%    -98%
trick   96.0/s   4491%   3948%      --     -0%
double  96.4/s   4512%   3967%      0%      --

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

Каждый раз, когда Вы смотрите на сравнительный тест, думайте о том, что он говорит Вам. Чтобы видеть, понимаете ли Вы это, измените данные и попробуйте еще раз. Делайте массивы долго, скаляры большой, и так далее. Сделайте циклы, власти, или regexes находят материал в запуске, середина и конец. Посмотрите, соответствуют ли новые результаты Вашему прогнозу. Фигура, какова тенденция. Производительность поправляется и лучше, приближается к пределу, пик затем начинают уменьшаться, или что-то еще?

8
ответ дан 3 December 2019 в 00:38
поделиться

Забавный необходимо поднять это!

Я недавно прочитал статью, анализируя выполнение двенадцати (!) различных реализаций для обрезки.

Хотя статья конкретно использует JavaScript regex реализация, это использует синтаксис Perl, таким образом, я думаю, что это кстати к этому обсуждению.

8
ответ дан 3 December 2019 в 00:38
поделиться

Утверждение от еретического, почему делают это вообще? Все вышеупомянутые решения "корректны" в этом, они обрезают пробел с обеих сторон строки в одной передаче, но ни один не ужасно читаем (ожидайте, возможно, этого). Если аудитория для Вашего кода не состоит из опытного уровня кодеры Perl, у каждого из вышеупомянутых кандидатов должен быть комментарий, описывающий, что они делают (вероятно, хорошая идея так или иначе). В отличие от этого, эти две строки выполняют то же самое, не используя предвидения, подстановочные знаки, midichlorines или что-либо, что не сразу очевидно для программиста умеренного опыта:

$string =~ s/^\s+//;
$string =~ s/\s+$//;

Существует (возможно) хит производительности, но, пока Вы не обеспокоены несколькими микросекундами при выполнении, добавленная удобочитаемость будет стоить того. По моему скромному мнению.

5
ответ дан 3 December 2019 в 00:38
поделиться

$x = ~ s / (^\\s +) | (\s+ $)//g;

2
ответ дан 3 December 2019 в 00:38
поделиться

Вот: $x =~ s/\A\s*(.*?)\s*\z/$1/;

4
ответ дан 3 December 2019 в 00:38
поделиться

Я обычно делаю это как это:

($foo) = $foo =~ /^\s*(.*?)\s*$/;

Все между ведущими пробелами и конечными пробелами сгруппировано и возвращено, таким образом, я могу присвоить его той же старой переменной.

1
ответ дан 3 December 2019 в 00:38
поделиться
s/^\s*(\S*\S)\s*$/$1/
0
ответ дан 3 December 2019 в 00:38
поделиться

Или это: s/\A\s*|\s*\Z//g

0
ответ дан 3 December 2019 в 00:38
поделиться
$x =~ s/^\s*(.*?)\s*$/$1/;
-2
ответ дан 3 December 2019 в 00:38
поделиться
$var1 =~ s/(^\s*)(.*?)(\s*$)+/$2/;
-1
ответ дан 3 December 2019 в 00:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: