Добавьте количество пробелов в начале каждой строки (в пределах одной строки) - PullRequest
4 голосов
/ 04 ноября 2011

Это своего рода дополнительный вопрос к Perl: добавить символ в начало строки .

Ситуация
В существующем Perlскрипт У меня разумная длинная строка $str, содержащая неизвестное количество разрывов строк (\n).Теперь в конце строки есть разрыв строки.

$str = "Hello\nWorld.\nHow is it going?"

Проблема
Я хотел бы добавить определенное (постоянное) количество пробелов в началекаждая строка в строке: (в данном случае 3)

$str = "   Hello\n   World.\n   How is it going?"

Первый подход Мой первый подход был следующим RegEx

$str =~ s/(.*?\n)/   \1/g;

И для кэширования последнегострока, которая не заканчивается новой строкой

$str =~ s/(.*)\n(.*)?$/\1\n   \2/g;

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

Итак, какие возможности есть у этой проблемы?
Спасибо за любой ответ.

Ответы [ 2 ]

6 голосов
/ 04 ноября 2011

Соответствует началу каждой строки вместо этого, возможно:

$str =~ s/^/   /mg;

Примечания от perlre:

  • ^ - соответствует началу строки.
  • m - обрабатывать строку несколькими строками, чтобы ^ и $ соответствовали началу и концу строки в любом месте строки, а не только началу и концу в целом.
  • g - глобальный - применяется к каждому найденному совпадению.
0 голосов
/ 04 ноября 2011

Я думаю, что ОП означало, что символы новой строки являются частью строки? Если это так, то это регулярное выражение:

$subject =~ s/((?<=^)|(?<=\\n))/    /g;

Должно работать.

Объяснение:

"
(              # Match the regular expression below and capture its match into backreference number 1
                  # Match either the regular expression below (attempting the next alternative only if this one fails)
      (?<=           # Assert that the regex below can be matched, with the match ending at this position (positive lookbehind)
         ^              # Assert position at the beginning of the string
      )
   |              # Or match regular expression number 2 below (the entire group fails if this one fails to match)
      (?<=           # Assert that the regex below can be matched, with the match ending at this position (positive lookbehind)
         \\n             # Match a line feed character
      )
)
"

Посмотрите, как это работает здесь .

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